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

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

  • Есть ли способ, использующий скрипт bash, чтобы получить местоположение изменений, сделанных в последнем git-коммите?
  • определить, существуют ли IP-адреса в списке A в списке диапазонов IP в списке B
  • Исходное синтаксическое объяснение переменных в bashrc
  • Сценарий оболочки: «если файл не используется»
  • загрузка файла один раз и воспроизведение его несколько раз
  • Перенаправление stdout и stderr определенных строк
  • Сравните файл с столбцом другого файла
  • Многопоточность / Викинг в сценарии bash
  • 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 - лучшая ОС в мире.