Kernel# зависает, а Kernel# - нет при выдаче 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 ответ
Оператор backticks неявно перенаправляет стандартный вывод результирующей подоболочки (что он делает для захвата вывода подоболочки), пока 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
...
куда ...
указывает на то, что gzip
будет зависать, пока не получит соответствующий сигнал.