Как получить код возврата команды в канале, выполняемом в качестве фонового процесса?

В скрипте Bash, если я запускаю команду в трубе, специальный параметр $? будет содержать код возврата последней команды в канале. Например, с преднамеренным провалом rsync команда, я получаю код возврата tee команда:

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 | tee outfile1 > outfile2
$ echo $?
0

Я могу получить код возврата rsync команда с использованием первой записи в специальном массиве, который содержит коды возврата последнего канала $PIPESTATUS

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 | tee outfile1 > outfile2
$ echo ${PIPESTATUS[0]}
23

Обычно, если я справляюсь с задачей, я могу использовать wait собрать свой код возврата, как wait отразит код возврата фоновой задачи, которую он ждет.

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 > outfile1 &
$ wait $!
$ echo $?
23

Я не могу объединить эти два метода для захвата кода возврата, если фоновый процесс включает в себя канал? У меня есть ощущение, что комбинирование методов - это не способ сделать это, и мне нужно использовать другой подход.

Как выполнить команду, подобную следующей, и собрать код возврата первой команды?

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 | tee outfile1 > outfile2 &

0 ответов

Вы можете получить доступ к переменной PIPESTATUS внутри фонового процесса:

$ { rsync /non-existent-dir/ /another-dir2/ 2>&1 | tee outfile1 > outfile2 ; echo $PIPESTATUS } &

Если вы хотите знать только статус выхода команды rsync, вы можете просто использовать exit ${PIPESTATUS[0]}вместо команды echo. В противном случае вам придется использовать временный файл.

Ссылка: https://stackoverflow.com/a/50754377/13534737

Другие вопросы по тегам