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 будет зависать, пока не получит соответствующий сигнал.

Другие вопросы по тегам