在没有任何选项的情况下发出gzip时,内核#卡住并且内核#系统没有

时间:2013-08-07 16:36:23

标签: 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>'

它将无限期地等待,直到我按CTRL + C.

虽然,我使用时:

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

,它将继续

为什么使用反引号会阻止进程继续?

1 个答案:

答案 0 :(得分:2)

反引号运算符隐式重定向结果子shell的标准输出(它捕获子shell的输出),而system则没有。您可以使用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 > /tmp/foo
...

...表示gzip在收到适当信号之前会挂起。