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

  • Выполняет ли дочерний процесс fork оболочки в bg сигналы SIGSTOP от родителя?
  • Процесс Rogue Java останавливает мой компьютер
  • процесс id и процесс убийства - ps commmand
  • Является ли упорный зомби-процесс признаком ошибки?
  • Зачем добавлять круглые скобки вокруг имени процесса?
  • Подождите, пока процесс переднего плана испустит строку, затем отправьте на задний план
  • Как получить RUSER и EUSER процесса (FreeBSD)
  • Безмоментный запуск задачи в фоновом режиме
  • Почему я могу перечислить другие процессы пользователей без разрешения root?
  • Убивать дочерние родительские процессы в одной команде
  • Почему я не мог убить процесс NOHUP?
  • Interesting Posts

    Kali Linux – «пакет не имеет кандидата на установку» (также thinkpad-acpi)

    Сканеры уязвимостей и исправления для Solaris

    Что происходит с моим планировщиком cron? (rsnapshot)

    Как я могу контролировать диск io?

    Зачем кому-то помещать что-либо в / etc / zshenv или ~ / .zshenv?

    При установке виртуального бокса на 64-разрядную машину kali linux 2.0 мне нужно установить среду chroot?

    мой Linux не может видеть устройство srix card atrix 4g

    Почему я могу запустить `sudo bash`, но не` sudo su`?

    Почему команды post-up в / etc / network / interfaces выполняются несколько раз при загрузке?

    Как я могу сделать перенос .muttrc переносимым на старые машины, несмотря на «неизвестную переменную»,

    Пользовательские глобальные ярлыки KDE

    mount iso image: сообщение «блочное устройство защищено от записи, установка только для чтения»!

    Как автоматически включить горячую точку?

    Я не загружаюсь из своего ssd. Безопасно ли прокомментировать / boot / efi строку в файле / etc / fstab?

    Надежный внешний адаптер Wifi для Backtrack

    Linux и Unix - лучшая ОС в мире.