За ваш первый вопрос. Я не совсем понимаю это, но вижу, что вы спрашиваете об одном из двух.
- Вы запускаете вещи в функции bash (grep, awk, sed и т. Д.), И поскольку эта функция долго работает, вы боитесь, что используемые вами утилиты так или иначе остаются открытыми.
- Вы передаете выходные данные от одной команды к другой и боитесь, что команда останется открытой после ее завершения.
Ни 1, ни 2 не оставят служебные команды «открытыми» после завершения работы. Вы можете доказать это, введя
ps -ef | grep "command" | grep -v 'grep'
по всему коду, чтобы увидеть, что работает под этим именем. или
ps -ef | grep "$$" | grep -v 'grep'
, в котором будут перечислены вещи, которые породил текущий процесс.
UPDATE:
Итак, похоже, вас интересует, как все работает из трубы. Вы можете увидеть это визуально, используя следующую команду:
$ ls / | grep bin | grep bin | ps -ef | grep ls
$
Сравните это с чем-то вроде:
$ find ~ | grep bin | ps -ef | grep find
$
Обратите внимание на то, что 'ls' больше нет в списке процессов, но находка есть. Возможно, вам придется добавить больше команд "grep bin" в конвейер, чтобы получить эффект. Как только первая команда закончит вывод, она закроется, даже если остальные команды еще не завершены. Другие команды будут завершены, когда они завершат обработку выходных данных первой (таким образом, характер канала)