Ruby 当在没有任何选项的情况下发出gzip时,Kernel#卡住了,Kernel#系统没有
长话短说,我一直在做一个项目,我注意到当我使用:Ruby 当在没有任何选项的情况下发出gzip时,Kernel#卡住了,Kernel#系统没有,ruby,linux,gzip,Ruby,Linux,Gzip,长话短说,我一直在做一个项目,我注意到当我使用: 1.9.3p392 :001 > `gzip` IRB::Abort: abort then interrupt! from (irb):1:in `call' from (irb):1:in ``' from (irb):1 from /usr/local/rvm/rubies/ruby-1.9.3-p392/bin/irb:16:in `<main>' 1.9.3p392 :047 >
1.9.3p392 :001 > `gzip`
IRB::Abort: abort then interrupt!
from (irb):1:in `call'
from (irb):1:in ``'
from (irb):1
from /usr/local/rvm/rubies/ruby-1.9.3-p392/bin/irb:16:in `<main>'
1.9.3p392 :047 > system('gzip')
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h
=> false
它将在我不使用CTRL+C的情况下继续
为什么使用backticks会阻止进程继续?backticks操作符隐式重定向生成的子shell的标准输出(它这样做是为了捕获子shell的输出),而
系统不这样做。您可以使用system
观察相同的挂起,如下所示:
system('gzip > /tmp/foo')
这会显式地捕获标准输出,并以相同的方式挂起
当gzip
的输出重定向时,它将等待输入,直到收到EOF
或其他信号。如果没有输出重定向,它将发出您提到的错误消息。您可以从常规的bash
shell中获得相同的效果:
$ gzip
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h
以及:
其中,…
表示gzip
将挂起,直到收到适当的信号。谢谢Richard!这肯定回答了我的问题。
$ gzip > /tmp/foo
...