Bu eski bir soru ama burada cevapların hiçbiri kullanımını tartışmak set -eaka set -o errexitkomut dosyalarını işleme Debian paketinde. Debian politikası uyarınca, bu komut dosyalarında bu seçeneğin kullanılması zorunludur ; amaç, işlenmemiş bir hata durumu olasılığından kaçınmaktır.
Uygulamada bunun anlamı, çalıştırdığınız komutların hangi koşullar altında bir hata döndürebileceğini anlamanız ve bu hataların her birini açıkça işleyebilmenizdir.
Ortak yakalamalar örn. diff(Fark grepolduğunda bir hata döndürür ) ve (eşleşme olmadığında bir hata döndürür). Açık işleme ile hataları önleyebilirsiniz:
diff this that ||
echo "$0: there was a difference" >&2
grep cat food ||
echo "$0: no cat in the food" >&2
(Geçerli komut dosyasının adını mesaja dahil etmeye ve tanılama mesajlarını standart çıktı yerine standart hataya yazmaya nasıl dikkat ettiğimize de dikkat edin.)
Hiçbir açık işlem gerçekten gerekli veya yararlı değilse, açıkça hiçbir şey yapmayın:
diff this that || true
grep cat food || :
(Kabuğun :no-op komutunun kullanımı biraz belirsizdir, ancak oldukça yaygındır.)
Tekrarlamak gerekirse,
something || other
için kestirme
if something; then
: nothing
else
other
fi
yani açıkça otherve sadece somethingbaşarısız olursa çalıştırılması gerektiğini söylüyoruz . Longhand if(ve benzeri diğer kabuk akış kontrol deyimleri while, until) aynı zamanda bir hata işlemek için geçerli bir yoldur (gerçekten de olmasaydı, ile kabuk komut set -eakış kontrol beyanlarını ihtiva asla!)
Ve ayrıca, açık bir şekilde, böyle bir işleyicinin yokluğunda, bir fark bulunursa veya bir eşleşme bulamazsa , set -ekomut dosyasının tamamının bir hatayla hemen başarısız olmasına neden olur .diffgrep
Diğer yandan, bazı komutlar istediğiniz zaman hata çıkış durumu oluşturmaz. Genellikle sorunlu komutlar find(çıkış durumu dosyaların gerçekten bulunup bulunmadığını yansıtmaz) ve sed(çıkış durumu komut dosyasının herhangi bir girdi alıp almadığını veya gerçekten herhangi bir komutu başarıyla gerçekleştirip gerçekleştirmediğini göstermez). Bazı senaryolarda basit bir koruma, çıktı yoksa çığlık atan bir komuta boru bağlamaktır:
find things | grep .
sed -e 's/o/me/' stuff | grep ^
Bir boru hattının çıkış durumunun, o boru hattındaki son komutun çıkış durumu olduğuna dikkat edilmelidir. Yukarıdaki komutlar Yani aslında tamamen durumunu maske findve sedve sadece olmadığını söylemek grepnihayet başardı.
(Elbette Bash vardır set -o pipefail; ancak Debian paket komut dosyaları Bash özelliklerini kullanamaz. Politika sh, bu komut dosyaları için POSIX kullanımını kesin olarak belirler , ancak bu her zaman böyle değildir.)
Birçok durumda, bu defansif kodlama yaparken dikkat edilmesi gereken bir şeydir. Bazen, geçici bir dosyadan geçmeniz gerekir, böylece deyim ve rahatlık, aksi takdirde sizi bir kabuk boru hattı kullanmaya yönlendirecek olsa bile, bu çıktıyı üreten komutun başarıyla tamamlanıp tamamlanmadığını görebilirsiniz.