Я вообще не знаю 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
Это не так хорошо, как PIPESTATUS Bash, потому что он опирается на некоторую файловую систему и возможность писать туда, мало что может пойти не так и не быть пойманным. Все еще лучше чем ничего.