通过管道执行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) }