Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过管道执行ruby脚本时,$stdin.get不起作用_Ruby_Command Line - Fatal编程技术网

通过管道执行ruby脚本时,$stdin.get不起作用

通过管道执行ruby脚本时,$stdin.get不起作用,ruby,command-line,Ruby,Command Line,下面是一个示例ruby代码: r = gets puts r 如果脚本是从控制台独立执行的,则可以正常工作。但如果我通过管道运行它: echo 'testtest' | ruby test.rb getseem被重定向到管道输入,但我需要一些用户输入 调用shell如何将Stdin连接到管道的接收端。如果你真的需要交互式输入,你有两个选择。您可以直接打开tty输入,将stdin绑定到管道: tty_input = open('/dev/tty') {|f| f.gets } /dev/tt

下面是一个示例ruby代码:

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

echo 'testtest' | ruby test.rb
get
seem被重定向到管道输入,但我需要一些用户输入


调用shell如何将Stdin连接到管道的接收端。如果你真的需要交互式输入,你有两个选择。您可以直接打开tty输入,将stdin绑定到管道:

tty_input = open('/dev/tty') {|f| f.gets }
/dev/tty
在linux和OS/x下工作,但可能不适用于任何地方

或者,您也可以在bash下使用不同形式的重定向,以psuedo文件的形式提供(以前是管道)输入,并将stdin绑定到终端:

ruby test.rb <(echo 'testtest')

# test.rb
input = open(ARGV[0])
std_input = gets
input.readlines { |line| process_line(line) }

ruby test.rb在MacOS下对其进行了测试。ruby没有对其进行重新定向,而是在shell/OS的外部级别上对其进行重新定向。就Ruby脚本而言,它仍然是STDIN。您可能仍然能够使用直接扫描键盘的代码(我不知道有多少帮助),但对于打算使用管道输入运行的实用程序来说,这将是一种不寻常的情况。在管道中工作和通过键盘交互对代码都有严格要求吗?是的。我编写了一个程序来继续输出“svn状态”,并在用户想要解决冲突时提示。它不可能是简单的是或不是,用户可以手动合并更改并将其标记为已解决,或者只是保持它不变。我尝试使用分叉进程
获取
,但仍然不起作用..进程替换有效。和open('/dev/tty')不在MacOS上工作。第一个代码块有一个错误,它应该是:
tty\u input=open('/dev/tty'){f | f.gets}
(no
do
关键字)