Bagaimana cara memeriksa status pengembalian perintah pipa dalam ash shell?

0

Bagaimana cara mengecek kembali kode untuk proses yang disalurkan satu sama lain dalam ash shell?

Inilah perintah yang saya minati:

dd if=/my/block/device | ssh myuser@otherserver "gzip > file.gz" 

Juga, saya tahu ini telah dijawab untuk bash shell (yaitu, menggunakan array PIPESTATUS), tetapi saya lingkungan saya menggunakan ash shell.

hebbo
sumber

Jawaban:

1

Saya tidak tahu ashsama 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 mktempuntuk membuat file sementara, printfbukan 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 PIPESTATUSkarena 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.

Kamil Maciorowski
sumber
Catatan: Saya akan membatalkan jawaban yang lebih baik daripada jawaban saya; khususnya jawaban yang menggunakan cara benar-ash spesifik (jika ada) untuk menyelesaikan masalah. Jika Anda menulis jawaban seperti itu, tinggalkan komentar di bawah jawaban saya.
Kamil Maciorowski