desen bulunamadığı zaman kabuk betiğinden erken çıkmayı önlemek için "set -e" ve "grep" deyimi


15

Yardım gerekli - GNU / LINUX temelindeki kabuk komut dosyası oluşturma bağlamında:

Ben her zaman kullanırım set -e. Çoğunlukla, grepher zaman betiğin bulunmadığını gösteren grepbir çıkış durumu varsa , komut dosyasının yürütmeyi sonlandırmasını istemem ve istemiyorum 1.

Bu sorunu çözmeye çalıştığım şeyler şunlardır:

(Deneyin I)
Eğer set +o pipefailve eğer böyle bir şey ile grep çağırmak grep 'p' | wc -lo zaman gelecekteki bir koruyucu etkinleştirmek kadar istenen davranışı almak pipefail. Ayrıca, etkinleştirmeyi seviyorum, pipefailbu yüzden bu benim için çalışmıyor.

(II'yi deneyin)
Bir sedveya awkyalnızca desenle wceşleşen satırları , ardından eşleşen deseni test etmek için eşleşen satırları kullanın. Kullanarak çünkü bu seçenek gibi yok sedetmek grepbenim gerçek sorun için bir çözüm gibi görünüyor.

(Deneyin III)
Bu benim en sevdiğim - böyle bir şey:set +e; grep 'p'; set-e

Herhangi bir içgörü / deyim çok takdir edilecektir - teşekkür ederim.

Yanıtlar:


19

Grep'i bir ifkoşula koyabilir veya çıkış durumunu umursamıyorsanız ekleyin || true.

Örnek: grepkabuğu öldürür

$ bash
$ set -e
$ echo $$
33913
$ grep foo /etc/motd
$ echo $$
9233

Çözüm 1: Sıfır dışı çıkış durumunu atın

$ bash
$ set -e
$ echo $$
34074
$ grep foo /etc/motd || true
$ echo $$
34074

Çözüm 2: Çıkış durumunu açıkça test edin

$ if ! grep foo /etc/motd; then echo not found; fi
not found
$ echo $$
34074

Bash man sayfasından set -eşunları tartışıyoruz :

Başarısız olan komut, bir süre sonra veya anahtar kelimeye kadar hemen sonra komut listesinin bir parçasıysa, if veya elif ayrılmış sözcükleri izleyen testin bir parçası, && veya ││ listesinde yürütülen herhangi bir komutun bir parçasıysa, kabuk çıkmaz son && veya ││ komutundan sonra, bir ardışık düzende sondan başka herhangi bir komut veya komutun dönüş değeri ters çevriliyorsa ! .


Bash'nin uzun süre doğru bir şekilde uygulanmadığı göz önüne alındığında, belgelerin henüz doğru olmaması olabilir. Metin bash-3.x man sayfası ile aynı gibi göründüğünden, lütfen unutmayın: bash4.0'dan önceki tüm bash sürümleri -e yanlış uygular.
schily

Ayrıca POSIX standardı da yanlış olduğundan, 2009'da -e ile POSIX metnini hata işlemesi için değiştirdik
schily

1
@schily Lütfen -e'nin 'doğru' davranışının ne olduğunu, bash <4'ün farklı olarak ne yaptığını ve POSIX'te nelerin değiştiğini bulabileceğinize işaretçiler verin.
zwol

Bash-3'teki hatalar, makeher zaman hatalardan çıkmadığı için onu kullanılamaz hale getirir . İlgili POSIX tartışmaları için austingroupbugs.net
schily

@schily Daha spesifik olabilir misiniz?
zwol
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.