Подождите, пока подошвы 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 не работает:

  • Почему команда «ls» * «" ничего не показывает?
  • Выполнение выражения Bash из sudo
  • Зеркалирование stackexchange, включая внешние изображения
  • Вызов Bash - backspace удаляет правый выровненный текст (можно остановить?)
  • Каковы преимущества использования Tmux в любое время?
  • Bash, выполнить команду после вызова новой оболочки
  •  $ ./test.sh hello $ hello hello hello 

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

  • Выполняйте каждую команду в терминале из верхней строки / Выполните очистку перед каждой командой
  • Как выйти из сценария в условном выражении?
  • Использование sed для замены строки со многими специальными символами?
  • Bash: преобразовать многострочный вывод в одну строку
  • Хранение терминала xterm в режиме реального времени на crunchbang linux debian wheezy
  • Почему rm * (1) * удаляет все файлы в каталоге?
  • 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 - лучшая ОС в мире.