Bu eski bir soru ama burada cevapların hiçbiri kullanımını tartışmak set -e
aka set -o errexit
komut 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 grep
olduğ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 other
ve sadece something
baş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 -e
akış 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 -e
komut dosyasının tamamının bir hatayla hemen başarısız olmasına neden olur .diff
grep
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 find
ve sed
ve sadece olmadığını söylemek grep
nihayet 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.