Bilmiyorum ash
hiç. Bu genel geçici çözüm şu durumlarda bile çalışmalıdır 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" )
Sonra içeriğini kontrol edin /tmp/pipestatus
. Bir kusur var: yarış durumu, iki ( )
blok paralel koşuyor, doğru sırayla değil dosyaya çıkabiliyorlar. Öyle kullandım >>
ki hiçbir mesaj diğerinin üzerine yazmaz; "mesajlar" kısa, bu yüzden araya girmemeliler; "mesajları" numaralandırdım, sırayla olmasalar bile, doğru sırayı sonradan alabilirsiniz ( sort
, cut
).
Yukarıdaki kod zaten sadece bir örnektir. Daha sağlam bir çözüm yerine mktemp
geçici bir dosya (lar) oluşturmak için printf
kullanılır echo
. Yarış koşullarından tamamen kurtulmak için ayrı dosyalara yazmanız gerekir :
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'inki kadar iyi değil PIPESTATUS
çünkü bazı dosya sistemlerine ve orada yazma yeteneğine dayanıyor, birkaç şey yanlış gidebilir ve yakalanmayabilir. Hala hiç olmamasından iyidir.
ash
e özgü sağ sorunu çözmek için bir yol (varsa). Eğer böyle bir cevap yazarsanız, cevabımın altında bana bir yorum bırakın.