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" без ее ручного тестирования (как это делаю я).
disown
удаляет задание только из таблицы активных заданий (, поддерживаемых оболочкой ), гарантируя, что соответствующий процесс не будет уничтожен при завершении работы оболочки. Это не меняет настройки ввода-вывода, заданные для процесса (стандартный ввод, вывод и ошибка ); таким образом, выходные данные отклоненного задания по-прежнему отправляются на терминал, с которого оно было запущено, или туда, куда оно было перенаправлено. Если вы закроете терминал (, предполагая, что вывод идет туда ), то вывод будет потерян, и открытие новой оболочки не восстановит вывод. В этом случае, как только процесс попытается прочитать или записать на терминал, он получит сигнал зависания -; подробности см. в Разница между nohup, disown и & .
Чтобы полностью избежать этой проблемы, вы можете перенаправить вывод процесса на /dev/null
при его запуске.