通过管道执行ruby脚本时$ stdin.gets不起作用
这里有一个示例ruby代码:
r = gets puts r
如果脚本是从控制台独立执行的,它可以正常工作。 但如果我通过管道运行它:
echo 'testtest' | ruby test.rb
似乎被重定向到管道输入,但我需要一些用户输入。
怎么样?
Stdin已通过调用shell附加到管道的接收端。 如果你真的需要交互式输入,你有几个选择。 你可以直接打开tty输入,然后绑定到管道的stdin:
tty_input = open('/dev/tty') do {|f| f.gets }
/dev/tty
在linux和OS / x下工作,但可能无处不在。
或者,您可以使用不同forms的重定向, 进程替换 ,在bash下提供(以前称为管道)输入作为作为参数传递的伪文件,并将stdin绑定到您的终端:
ruby test.rb <(echo 'testtest') # test.rb input = open(ARGV[0]) std_input = gets input.readlines { |line| process_line(line) }