Я вообще не знаю ash
. Этот общий обходной путь должен работать даже в sh
:
psf=/tmp/pipestatus : > "$psf" # to make the file empty ( dd if=/my/block/device; echo "1 $?" >> "$psf" ) \ | ( ssh myuser@otherserver "gzip > file.gz"; echo "2 $?" >> "$psf" )
Затем вы проверяете содержание /tmp/pipestatus
. Существует недостаток: состояние гонки, два ( )
блока работают параллельно, они могут выводить в файл не в правильном порядке. Я использовал, >>
поэтому ни одно сообщение не будет перезаписывать другое; «сообщения» короткие, поэтому они не должны чередоваться; я пронумеровал «сообщения», поэтому, даже если они не в порядке, вы можете получить правильный порядок позже ( sort
, cut
).
Приведенный выше код является просто примером в любом случае. Более надежное решение использует mktemp
для создания временного файла (ов) printf
вместо echo
. Чтобы полностью избавиться от состояния гонки, вам нужно записать в отдельные файлы:
psd="$(mktemp -d)" # you may want to check if the above command succeeded ( dd if=/my/block/device; printf '%s\n' "$?" > "$psd/f1" ) \ | ( ssh myuser@otherserver "gzip > file.gz"; printf '%s\n' "$?" > "$psd/f2" ) # retrieve the results here, they are in "$psd/f1" and "$psd/f2" rm -rf "$psd" unset psd
Это не так хорошо, как у Bash, PIPESTATUS
потому что он опирается на некоторую файловую систему и возможность писать туда, мало что может пойти не так и может быть не поймано. Все еще лучше чем ничего.