Может программа затем в конвейере видеть код выхода предыдущей программы?

. и .. жесткие ссылки на ток и родительский каталог (/ родитель себя).

С -a опция ls шоу весь inodes в текущем каталоге, т.е. также скрытые файлы, какие имена файлов начинаются с точки рекламы, поэтому . и .. показаны.

8
08.03.2014, 01:47
5 ответов
[113558] Общий ответ - нет. Возможно, что [114041]prog2[114042] выйдет еще до того, как [114043]prog1[114044] даже начнется (очевидно, этого не произойдет, если [114045]prog2[114046] на самом деле прочитает какой-нибудь входной сигнал, что вы и ожидали бы от него, если бы он использовался в трубопроводе). Определённо возможно, что [114047]prog2[114048] выйдет раньше [114049]prog1[114050]; это происходит, например, когда [114051]prog2[114052] - поисковая программа, которая выходит, как только найдёт совпадение, и в этом случае [114053]prog1[114054], возможно, ещё не закончила выдачу всех данных.

Для [114055]prog2[114056] нет прямого способа получить статус выхода из [114057]prog1[114058] или даже узнать, что [114059]prog1[114060] вышла из программы. Всё, что может знать [114061]prog2[114062], это то, что [114063]prog1[114064] закрыла свой конец трубы, что она может сделать, не умирая.

Если вы хотите получить статус выхода [114065]prog1[114066] из [114067]prog2[114068], есть два общих метода: вы можете записать его в файл, или отправить через трубу. Возможна отправка статуса выхода как последней строки данных трубопровода. Вы должны убедиться, что не обрабатываете последнюю строку, пока не узнаете, что это последняя строка, т.е. пока не попытаетесь прочитать следующую строку.

Вот пример, где справа расположен текстовый фильтр, окрашивающий каждую строку, содержащую слово "ошибка", в красный цвет. Если левая сторона не работает, правая выходит с тем же самым статусом.

4
27.01.2020, 20:12
[112703] Хотя в некоторых особых случаях (см. другие ответы) это возможно не в каждом случае. Некоторые программы-фильтры будут просто продолжать работать, в то время как другие будут держать все выводимые данные, разблокируют их за один взрыв, а затем выйдут.[12193] Например, программа "просто продолжайте работать", [113189]grep[113190] будет работать так же, как и [113191] tail -f /var/log/some_log_file[113192]. Использование [113193]сортировки[113194] в трубопроводе вызывает "сбой", так как [113195]сортировка[113196] будет собирать входные данные до тех пор, пока трубопровод перед ним не закроется. Использование [113197]xargs[113198] добавляет еще одно осложнение: запускаются ли программы [113199]xargs[113200] (может запускаться много экземпляров) частью трубопровода или нет?[112706].
2
27.01.2020, 20:12
[112697] Ответ: Не напрямую.[12191]@terdon показал, что код выхода предыдущей команды в трубе должен быть отправлен как явный параметр к следующей команде.[12192]Помните, что труба - это просто отображение STDOUT предыдущей команды на STDIN следующей команды; коды выхода не выводятся на STDOUT (или STDERR).[112702].
1
27.01.2020, 20:12
[113377]Весь процесс, в процессе работы, запускается перед любым выходом. Поэтому [113854]prog2[113855] могла бы получить эту информацию после того, как она была запущена, она также должна была бы приостановить обработку до выхода [113856]prog1[113857], это могло бы затормозить трубу. Похоже, что есть фундаментальные проблемы в том, чтобы делать то, что вы просите, а не ограничения операционной системы.

  1. Вероятно, вам нужно рассмотреть временный файл, или поместить результат в переменную.
  2. Пример для небольшого объема данных, используя переменную.
1
27.01.2020, 20:12

Чтобы закончить Ответ Жиля ,

(prog1; echo $? > /tmp/prog1.status) | prog2

- это подход. prog2 может либо

  • прочитать стандартный ввод до конца, а затем прочитать /tmp/prog1.status , либо
  • проверить наличие / tmp / prog1.status периодически при чтении стандартного ввода.
0
27.01.2020, 20:12

Теги

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