Birinci komutun başarılı olduğu bilinene kadar ikinci komutun ilerlemesini gerçekten istemiyorsanız, muhtemelen geçici dosyalar kullanmanız gerekir. Bunun basit versiyonu:
tmp=${TMPDIR:-/tmp}/mine.$$
if ./a > $tmp.1
then
if ./b <$tmp.1 >$tmp.2
then
if ./c <$tmp.2
then : OK
else echo "./c failed" 1>&2
fi
else echo "./b failed" 1>&2
fi
else echo "./a failed" 1>&2
fi
rm -f $tmp.[12]
'1> & 2' yönlendirmesi ayrıca '> & 2' kısaltılabilir; ancak, MKS kabuğunun eski bir sürümü, önceki '1' olmadan hata yeniden yönlendirmesini yanlış idare etti, bu nedenle, güvenilirlik için bu belirsiz gösterimi yıllarca kullandım.
Bu, bir şeyi kesintiye uğratırsanız dosyaları sızdırır. Bombaya dayanıklı (az ya da çok) mermi programlama şunları kullanır:
tmp=${TMPDIR:-/tmp}/mine.$$
trap 'rm -f $tmp.[12]; exit 1' 0 1 2 3 13 15
...if statement as before...
rm -f $tmp.[12]
trap 0 1 2 3 13 15
İlk tuzak satırı, rm -f $tmp.[12]; exit 1
1 SIGHUP, 2 SIGINT, 3 SIGQUIT, 13 SIGPIPE veya 15 SIGTERM sinyallerinden herhangi biri gerçekleştiğinde veya 0 (kabuk herhangi bir nedenle çıktığında) ' komutları çalıştır' diyor . Bir kabuk betiği yazıyorsanız, son tuzağın yalnızca, kabuk çıkış tuzağı olan 0'daki kapanı kaldırması gerekir (işlem yine de sona ermek üzere olduğundan diğer sinyalleri yerinde bırakabilirsiniz).
Orijinal ardışık düzende, 'c'nin' a 'bitmeden önce' b'den veri okuyor olması mümkündür - bu genellikle arzu edilir (örneğin, yapılması gereken çok çekirdekli çalışma sağlar). Eğer 'b' bir 'sıralama' fazıysa, o zaman bu geçerli olmayacaktır - 'b' herhangi bir çıktı üretmeden önce tüm girdisini görmelidir.
Hangi komutların başarısız olduğunu tespit etmek istiyorsanız, şunları kullanabilirsiniz:
(./a || echo "./a exited with $?" 1>&2) |
(./b || echo "./b exited with $?" 1>&2) |
(./c || echo "./c exited with $?" 1>&2)
Bu basit ve simetriktir - 4 parçalı veya N parçalı bir boru hattına genişletmek önemsizdir.
'Set -e' ile basit deneyler yardımcı olmadı.
&&|
"Sadece önceki komut başarılı olursa boruya devam et" anlamına gelecek gibi bir şey olması gerekiyor . Sanırım|||
"önceki komut başarısız olursa boruya devam et" anlamına gelen (ve muhtemelen Bash 4'ler gibi hata mesajını yönlendiren|&
) anlamına da sahip olabilirsiniz .