Bir bash shebang'da ne yapar?


32

Aşağıdaki bir bash betiği var:

#!/bin/bash -e

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  echo "doesn't exist" 
fi

Bu script -e olmadan çalışmayacak. -eBu komut dosyası için ne yapar ? Ayrıca, $?bu bağlamda ne yapar ?


1
Garip. -eErkek sayfasında hayır (Bu adrese gerçekten bir cevap adresi görmek istiyorum). $?Son çıkış kodunu ( egrepyukarıda ortaya çıkan işlemin kodunu ) içerir.

2
@pst: -ealtında belgelenmiştir set.
Greg Hewgill

Senaryoyu şöyle yaparak sadeleştirebilirsin:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan

2
ifVe arasında boşluk bırakıyorsunuz [. Bu komut dosyası çalışmaz ile -e çünkü eğer, grepo zaman altında bir şey bulamazsa -ekomut hemen orada sona erer. Olmadan -e, mesajı geriye aldınız: $?0'ın durumu ( ), grep'in kullanıcıyı bulduğu anlamına gelir. Bunun "grep" ^ kullanıcı adı: 'olması gerektiğini unutmayın (bu arada (daha uzun adı olan başka bir kullanıcı varsa?).
Gilles 'SO- kötü olmayı durdur' 19

3
Satır # 1 ve hat # 2 ile #/bin/bash -eaynı etkiye sahip olacak mı? #/bin/bashset -e
Blong

Yanıtlar:


34

Çıkış hatası. Daha fazla bayrak

Bir hata varsa hemen çıkacaktır.

$? Geçmiş komutun çıkış durumu. Linux'ta 0 çıkış durumu, komutun başarılı olduğu anlamına gelir. Başka bir durum, bir hatanın meydana geldiği anlamına gelir.

egrep "^ username" / etc / passwd> / dev / null / etc / passwd dosyasının altındaki kullanıcı adını arar. Onu bulursa çıkış durumu $? 0'a eşit olacaktır. Eğer onu bulamazsa çıkış durumu başka bir şey olacaktır (0 değil), bu nedenle “echo yok” olacaktır.


Ek olarak, ilk iki satırı değiştirerek betiğin -e olmadan düzgün çalışmasını sağlayabilirsiniz if egrep "^username" /etc/passwd >/dev/null.

1
Neden setgerekli olmasın ? : - /

1
@pst: Çünkü bash'a -ekomut satırı argümanı olarak verildi. setAşağıda listelenen tüm seçenekler komut satırında bash tarafından da kabul edilir - kılavuz sayfasının Seçenekler bölümünde ilk cümleyi not edin .
Grawity

14

Tüm bash komut satırı anahtarları içinde belgelenmiştir man bash.

      -e Bir boru hattından (örneğin
              tek basit komut), içine alınmış bir alt kabuk komutu
              parantez veya komutun bir parçası olarak yürütülen komutlardan biri
              parantez içine alınmış bir komut listesi (bkz. SHELL GRAMMAR
              Yukarıdaki) sıfır olmayan bir durumdan çıkar. Kabuk değil
              başarısız olan komut komutun bir parçasıysa, exit
              Bir süre sonra veya anahtar kelimeye kadar hemen listeleyebilir,
              if veya elif rezervini takiben testin bir kısmı
              kelimeler, bir && veya || liste
              final && veya ||
              Bir boru hattında komut ancak sonuncusu veya komutun
              dönüş değeri! ile ters çevriliyor. ERR üzerine bir tuzak,
              ayarlanırsa, kabuk çıkmadan önce yürütülür. Bu seçenek
              Kabuk ortamına ve her alt kabuk ortamına uygulanır.
              ayrı ayrı ronment (bkz. KOMİSYON YÜRÜTME ORTAMI
              yukarıdaki) ve çalıştırmadan önce alt kabukların çıkmasına neden olabilir
              deniz kabuğundaki tüm komutlar.

2
Ahh. Adamda aradım, ama dosya testlerinde -e'yi bulduktan sonra ve ana tartışmaların altında hiç -e bıraktım. Güzel alıntı. Neden setgerekli olmasın ? : - /

1

Komut dosyanız yanlış çünkü

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  #echo "doesn't exist" # WRONG
  echo "the USER EXISTS"
fi

çıkış durumu 0 - ortalama - her şey yolunda, grep ortalaması "Tamam, dizeyi buldu" durumunda. exit status! = 0 bir şeyin yanlış olduğu anlamına gelir; grep 1 durumunda, "bulunamadı", 2 demek "girişi açamıyorum" ...

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.