Предположим, у меня есть следующая труба:
a | b | c | d
Как я могу ждать завершения c
(или b
) в sh
или bash
? Это означает, что скрипт d
может запускаться в любое время (и его не нужно ждать), но c
для корректной работы требуется полный вывод из .
Вариант использования предназначен difftool
для git
сравнения изображений. Он вызывается git
и должен обработать свой ввод ( a | b | c
часть) и отобразить результаты сравнения ( d
часть). Вызывающая сторона удалит ввод, который требуется для a
и b
. Это означает, что перед возвратом из сценария процесс c
(или b
) должен завершиться. С другой стороны, я не могу ждать, d
потому что это означает, что я жду ввода пользователя.
Я знаю, что могу записать результаты c
во временный файл или, возможно, использовать FIFO в bash
. (Однако не уверен, что FIFO поможет.) Можно ли добиться этого без временных файлов sh
?
РЕДАКТИРОВАТЬ
Возможно, было бы достаточно, если бы я мог достоверно узнать идентификатор процесса c
(или b
) процесса. Тогда весь канал мог бы быть запущен асинхронно, и я мог ждать идентификатор процесса. Нечто подобное
wait $(a | b | { c & [print PID of c] ; } | d)
EDIT ^ 2
Я нашел решение, комментарии (или еще лучшие решения) приветствуются.
d
начать обработкуc
вывода только послеc
завершения? Вы не хотитеd
начинать обрабатывать каждую строку вывода, как она есть?d
можно начинать, когда захочется , ноc
нужно закончить, прежде чем я смогу двигаться дальше.d
можете начать, когда захотите, чего именно вы ждете?d
не использовать выходные данные,c
то, кажется, не имеет никакого смысла делатьd
часть конвейера. Но еслиd
он использует входные данные, тоd
должен некоторое время поработать над их вводом после прочтения всего этого, чтобы ваш подход имел какое-либо значение.Ответы:
Уведомление может быть сделано, например, с помощью сигнала PID, который был передан в переменной среды (
kill -USR1 $EXTPID
), или путем создания файла (touch /path/to/file
).Еще одна идея:
Вы выполняете следующий процесс (тот, который можно запустить, которого вы ожидаете) из конвейера:
или
источник
notify
может быть выполнено до того, как я настрою ловушку сигнала. Как я могу убедиться, что не пропустил этот сигнал?trap
как был определен.{ c; bg; }
или{ c; exit 0; }
, кажется, не работает.Если я правильно понимаю ваш вопрос, это должно сработать:
(хитрость fd 3 в том, что некоторые (большинство) оболочек перенаправляют stdin в / dev / null с помощью
&
).источник
В bash вы можете использовать процесс подстановки . Команда в процессе подстановки выполняется асинхронно, ее не ждут.
источник
bash
только верно - безsh
поддержки?Это то, что я нашел методом проб и ошибок с помощью ввода Хауке:
Эквивалентное:
(Последнее является более явным, потому что
{}
все равно будет работать в подоболочке, если внутри трубы.)Некоторые другие сигналы (в том числе
QUIT
,TERM
иUSR1
) тоже работают, однако в этом случае описание сигнала отображается на терминале.Интересно, является ли это изначальным намерением
PIPE
сигнала. Согласно инструкции :Это означает, что когда я искусственно посылаю сигнал канала в подоболочку, он молча завершается, оставляя конечного потребителя в
d
покое ( ).Это работает в обоих
sh
иbash
.источник
Вы можете использовать
sponge
программу из пакета "moreutils":a | b | c | sponge | d
Губка будет в конце
c
выходного, прежде чем обвязать егоd
. Надеюсь, это то, что вы хотели.источник
Вы можете просто сделать:
Таким образом, когда он завершится
d
, онcat
будет поглощать остальную частьc
выходных данных до тех пор, пока не завершится.ОК. После комментариев, я думаю, что ответ должен начать прямо
d
в фоновом режиме.Делать:
или используйте решение Stephane Chazelas , если есть проблемы с
d
чтением из stdin .источник
c
заканчивается раньше, чемd
нужно, и я должен ждать доc
конца, но мне все равноd
.c
заканчивается иd
все еще работает? Убитьd
?d
имеет графический интерфейс и может работать, пока пользователь не закроет его.a
,b
иc
закончить свою работу, они близко стандартный вывод и выход; и толькоd
работает. Вы хотите отправитьd
в фон послеc
окончания? Это оно?d
должны быть отправлены в фоновом режиме послеc
завершения.