Как получить код возврата команды в канале, выполняемом в качестве фонового процесса?
В скрипте 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. В противном случае вам придется использовать временный файл.