Команда find не находит файл в /sys/devices/ рекурсивно

В bashзамены процессов запускаются как фоновые задания. Вы можете получить pid ведущего процесса последнего с помощью $!, и вы можете получить его статус выхода с помощью wait thatpid, как и для других фоновых заданий :

.

$ bash -c 'cat <(exit 3); wait "$!"; echo "$?"'
3

Это не поможет, если вам нужно использовать две подстановки процессов в одной команде, как в diff <(cmd1) <(cmd2).

$ bash -c 'cat <(exit 3) <(exit 4); wait "$!"; echo "$?"'
4

Pid из exit 3выше потерян

Это можно восстановить с помощью такого трюка:

unset -v p1 p2
x='!'
cat <(exit 3) ${!x#${p1=$!}} <(exit 4) ${!x#${p2=$!}}

где оба pid хранятся в $p1и $p2, но это бесполезно, так как только последний вставляется в таблицу заданий оболочки, а waitотказывается ждать $p1, ошибочно утверждая, что он не является потомком этой оболочки , даже если $p1еще не завершился:

$ cat test-script
unset -v p1 p2
x='!'
set -o xtrace
cat <(echo x; exec >&-; sleep 1; exit 3) ${!x#${p1=$!}} <(exit 4) ${!x#${p2=$!}}
ps -fH
wait "$p1"; echo "$?"
wait "$p2"; echo "$?"
$ bash test-script
++ echo x
++ exec
++ sleep 1
+ cat /dev/fd/63 /dev/fd/62
++ exit 4
x
+ ps -fH
UID        PID  PPID  C STIME TTY          TIME CMD
chazelas 15393  9820  0 21:44 pts/4    00:00:00 /bin/zsh
chazelas 17769 15393  0 22:19 pts/4    00:00:00   bash test-script
chazelas 17770 17769  0 22:19 pts/4    00:00:00     bash test-script
chazelas 17772 17770  0 22:19 pts/4    00:00:00       sleep 1
chazelas 17776 17769  0 22:19 pts/4    00:00:00     ps -fH
+ wait 17770
test-script: line 6: wait: pid 17770 is not a child of this shell
+ echo 127
127
+ wait 17771
+ echo 4
4
$ ++ exit 3

Подробнее об этом в Ответ @mosvy на Запуск асинхронных задач и получение их кода выхода и вывода в bash

0
19.10.2020, 09:41
0 ответов

Теги

Похожие вопросы