В рамках сценария 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 &