Подождите, пока подошвы Bash

Я подключаю один и тот же контент к нескольким командам с помощью tee , subshells и redirects следующим образом:

 #!/usr/bin/env bash echo 'hello' | tee \ >( sleep 3; cat /dev/stdin ) \ >( sleep 2; cat /dev/stdin ) \ >( sleep 1; cat /dev/stdin ) wait # Doesn't work :( 

Тем не менее, я вижу, что вывод подзаголовка записывается в терминал после выхода основного сценария и wait не работает:

 $ ./test.sh hello $ hello hello hello 

Как правильно подождать подоболочек?

  • Как сделать сценарий /etc/init.d похожим на запуск в X?
  • Разве это имеет значение (например, по производительности), если я выполняю команду из сценария bash (по сравнению с командной строкой)?
  • Разделение `File` и` имя каталога с пробелом 'через скрипт оболочки
  • Разбиение последовательности на фиксированную ширину
  • Как проверить, имеет ли glob расширение?
  • Как ввести сумму, полученную из awk в середине вывода текста
  • Как создать скрипт для отправки электронной почты по telnet?
  • Скрипт для файлов SCP работает вручную, но не через cron
  • One Solution collect form web for “Подождите, пока подошвы Bash”

    В bash вы не можете ждать замены процесса. В:

     cmd1 > >(cmd2) 

    вся команда завершается, как только cmd1 заканчивается, независимо от состояния cmd2 .

    Вы должны реализовать механизм, чтобы сигнализировать родительский процесс, который cmd2 . Простым способом, используя fifo:

     #!/usr/bin/env bash trap 'rm wait.fifo' EXIT mkfifo wait.fifo echo 'hello' | tee \ >( sleep 3; cat /dev/stdin; : >wait.fifo ) \ >( sleep 2; cat /dev/stdin; : >wait.fifo ) \ >( sleep 1; cat /dev/stdin; : >wait.fifo ) for (( i=0;i<3;i++ )); do read <wait.fifo; done 
    Linux и Unix - лучшая ОС в мире.