Saya tidak tahu ash
sama sekali. Solusi umum ini harus bekerja bahkan di 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" )
Kemudian Anda memeriksa konten /tmp/pipestatus
. Ada cacat: kondisi balapan, dua ( )
blok berjalan secara paralel, mereka dapat menampilkan ke file tidak dalam urutan yang benar. Saya menggunakan >>
sehingga tidak ada pesan yang akan menimpa yang lain; "pesan-pesan" itu singkat, sehingga tidak boleh disisipkan; saya menomori "pesan", jadi meskipun tidak berurutan, Anda dapat mengambil urutan yang benar nanti ( sort
, cut
).
Kode di atas hanyalah sebuah contoh. Solusi yang lebih kuat digunakan mktemp
untuk membuat file sementara, printf
bukan echo
. Untuk menghilangkan kondisi ras sepenuhnya, Anda perlu menulis ke file terpisah :
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
Ini tidak sebagus Bash PIPESTATUS
karena bergantung pada beberapa sistem file dan kemampuan untuk menulis di sana, beberapa hal bisa salah dan mungkin tidak tertangkap. Masih lebih baik daripada tidak sama sekali.
ash
spesifik (jika ada) untuk menyelesaikan masalah. Jika Anda menulis jawaban seperti itu, tinggalkan komentar di bawah jawaban saya.