Bash unsets * _PID переменная, прежде чем я могу ждать на coproc

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

coproc LS { ls dir; } while IFS= read i; do echo "$i"; done <&"$LS" # Do something with the output. wait "$LS_PID"; echo $? # Check exit status. 

Проблема в том, что приведенный выше код не работает, по крайней мере, не с Bash 4.3.46(1)-release . После выполнения инструкции while Bash $LS_PID (вероятно, потому, что замечает, что процесс завершен). Ожидание wait в процессе все еще работает, например:

 coproc LS { ls dir; } P=$LS_PID while IFS= read i; do echo "$i"; done <&"$LS" # Do something with the output. wait "$P"; echo $? # Check exit status. 

Это будет печатать 0 или 2 зависимости от того, существует ли каталог. Таким образом, это просто неудобство, которое я должен сохранить PID для другой переменной. Но меня интересует, почему это происходит и могу ли я повлиять на это.

Почему $LS_PID отключен, прежде чем wait процесса? Это где-то документировано? Есть ли простой способ обхода, потому что я считаю, что для общего использования используется вывод команды, а также проверить его код выхода.

One Solution collect form web for “Bash unsets * _PID переменная, прежде чем я могу ждать на coproc”

Это предполагаемое поведение переменной COPROC_PID похоже, хотя это недокументировано в руководстве Bash.

Правильное обходное решение – сделать именно то, что вы сделали; сохраните значение $COPROC_PID в переменной, которая не будет отменена при выходе из совместного процесса.

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

Ссылка: http://gnu-bash.2382.n7.nabble.com/Several-issues-with-coprocesses-regarding-exit-status-td11125.html

  • Тройка> (процесс) обрезает его stdout при записи файла
  • Убейте процесс, начатый execl
  • Предотвращение случайного убийства неправильного процесса в htop
  • Хорошо ли использовать ~ 100% процессор по моему приложению
  • Почему «kill -9 0» заканчивает сеанс консоли?
  • Остановка заданий с помощью PID?
  • Элегантный список детских процессов
  • Как получить PID на терминал в начале * каждого * процесса?
  • Почему я могу перечислить другие процессы пользователей без разрешения root?
  • Как убить процесс, который нельзя убить без перезагрузки?
  • На `fork`, дочерних процессах и" подоболочках "
  • Linux и Unix - лучшая ОС в мире.