Ждите подоболочки в перенаправлении Bash IO - PullRequest
0 голосов
/ 05 октября 2018

Сценарий таков, что мне нужна моя основная команда для запуска в текущей оболочке, это требуется или теряет все окружение и т. Д.

Итак, я не могу просто запустить свой канал следующим образом:

#command-line 1
mainCommand | (
  ...subshell commands...
) &

#this wait works, but main command is in child process
wait $!

Мне нужно запустить основную команду в текущей оболочке:

#command-line 2
mainCommand &> >(
  ...subshell commands...
) &

#this wait is waiting for mainCommand, not subshell
wait $!

Однако в командной строке 2 это всего лишь одна команда, и я не могу просто отправить ее в фоновый режим,только фоновая оболочка должна перейти в фон, тогда я могу получить ее PID.

Как разрешить

  • Основная команда будет в текущей оболочке
  • И 'wait'команда на самом деле ждет подоболочки?

У меня есть решение для файла блокировки, но я предпочитаю не использовать файл, так как весь скрипт выполняется непрерывно, а запись / изменение файла снова и снова напоминает проникновение в файловую систему.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Дайте попытку этому.вам нужно добавить kill в команды subshell.

sleep 100 &
export BACKGROUNDPID=$!

mainCommand &> >(
  ...subshell commands...
  kill "${BACKGROUNDPID}"
) &

wait ${BACKGROUNDPID}"

# execution continue here ...
0 голосов
/ 05 октября 2018

Более новые версии bash позволяют ожидать замены процесса, но до тех пор я бы рекомендовал просто использовать именованный канал.

mkfifo p
( ... subshell commands ... ) < p &
mainCommand > p
wait
...