2

这是一个示例 ruby​​ 代码:

r = gets
puts r

如果脚本是从控制台独立执行的,它工作正常。但是如果我通过管道运行它:

echo 'testtest' | ruby test.rb

gets似乎被重定向到管道输入,但我需要一些用户输入。

如何?

4

1 回答 1

4

调用 shell 已将标准输入附加到管道的接收端。如果你真的需要交互式输入,你有几个选择。您可以直接打开 tty 输入,将 stdin 绑定到管道:

tty_input = open('/dev/tty') {|f| f.gets }

/dev/tty在 linux 和 OS/x 下工作,但可能无法在任何地方工作。

或者,您可以在 bash 下使用不同形式的重定向(进程替换)来提供(以前是管道)输入作为作为参数传递的伪文件,并将 stdin 绑定到您的终端:

ruby test.rb <(echo 'testtest')

# test.rb
input = open(ARGV[0])
std_input = gets
input.readlines { |line| process_line(line) }
于 2013-05-17T17:56:03.343 回答