Почему я все еще получаю stdout или stderr после отказа от процесса?

awk '
/foo/ { save=1 }
/baz/ { p=1 }
/bar/ { if (p) { print out ORS $0; } p=0; save=0; out="" }
{ if (save) { if (out) { out = out ORS $0 } else { out = $0 } } }
' input

Начать сохранение строк, если мы видим /foo/; решить, стоит ли их печатать, если мы видим /baz/, и как только мы увидим /bar/, напечатать сохраненные строки, если мы увидели /baz/.

Я не могу найти более умного способа предотвратить появление пустой строки (ORS) в начале переменной "out" без ее ручного тестирования (как это делаю я).

0
18.07.2017, 18:35
1 ответ

disownудаляет задание только из таблицы активных заданий (, поддерживаемых оболочкой ), гарантируя, что соответствующий процесс не будет уничтожен при завершении работы оболочки. Это не меняет настройки ввода-вывода, заданные для процесса (стандартный ввод, вывод и ошибка ); таким образом, выходные данные отклоненного задания по-прежнему отправляются на терминал, с которого оно было запущено, или туда, куда оно было перенаправлено. Если вы закроете терминал (, предполагая, что вывод идет туда ), то вывод будет потерян, и открытие новой оболочки не восстановит вывод. В этом случае, как только процесс попытается прочитать или записать на терминал, он получит сигнал зависания -; подробности см. в Разница между nohup, disown и & .

Чтобы полностью избежать этой проблемы, вы можете перенаправить вывод процесса на /dev/nullпри его запуске.

7
28.01.2020, 02:15

Теги

Похожие вопросы