Kül kabuğundaki borulu komutların dönüş durumları nasıl kontrol edilir?


0

Dişbudak kabuğu içerisinde birbirine aktarılan proseslerin dönüş kodları nasıl kontrol edilir?

İşte ilgilendiğim komut:

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

Ayrıca, bunun bash kabuğuna (yani, PIPESTATUS dizisini kullanarak) cevaplandığını biliyorum, ancak ortamım kül kabuğunu kullanıyor.

Yanıtlar:


1

Bilmiyorum ashhiç. 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 mktempgeçici bir dosya (lar) oluşturmak için printfkullanı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.


Not: Cevabını benimkinden daha iyi oylayacağım; kullanan bir cevap özellikle ashe ö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.
Kamil Maciorowski 29:18
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.