1

簡単に言えば、私はプロジェクトに取り組んでおり、使用すると次のことに気付きました。

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を使用せずに続行します

バッククォートを使用すると、プロセスの続行が停止するのはなぜですか?

4

1 に答える 1

2

バッククォート演算子は、結果のサブシェルの標準出力を暗黙的にリダイレクトします (サブシェルの出力をキャプチャするために行います) が、そうではありsystemません。system次のように使用して、同じハングを観察できます。

system('gzip > /tmp/foo')

これは明示的に標準出力をキャプチャし、同じようにハングアップします。

出力がリダイレクトされると、何らかの信号が受信gzipされるまで入力を待ちます。EOF出力リダイレクトがないと、言及したエラーメッセージが発行されます。bash通常のシェルから同じ効果を得ることができます:

$ gzip
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h

と:

$ gzip > /tmp/foo
...

whereは、適切なシグナルを受信するまでハングすることを...示します。gzip

于 2013-08-07T16:48:56.490 に答える