Apa yang kamu lakukan di bash shebang?

32

Saya memiliki skrip bash dengan yang berikut:

#!/bin/bash -e

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

Script ini tidak akan berjalan tanpa -e. Apa yang -edilakukan untuk skrip ini? Juga, apa yang $?dilakukan dalam konteks ini?

Chris Henry
sumber
1
Aneh. Tidak -edi halaman manual (saya benar-benar ingin melihat alamat jawaban ini). $?berisi kode keluar terakhir (kode egrepproses yang muncul di atas).
2
@pst: -edidokumentasikan di bawah set.
Greg Hewgill
Anda dapat menyederhanakan skrip Anda dengan melakukan ini:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan
2
Anda kehilangan ruang antara ifdan [. Script ini tidak akan bekerja dengan -e , karena jika greptidak menemukan apa-apa kemudian di bawah -escript akan mengakhiri sana. Tanpa -e, Anda mendapat pesan mundur: status ( $?) dari 0 berarti bahwa grep memang menemukan pengguna. Perhatikan bahwa ini seharusnya `grep '^ nama pengguna:', omong-omong (bagaimana jika ada pengguna lain dengan nama yang lebih panjang?).
Gilles 'SANGAT berhenti menjadi jahat'
3
Apakah akan #/bin/bash -ememiliki efek yang sama seperti #/bin/bashpada baris # 1 dan set -epada baris # 2?
blong

Jawaban:

34

Kesalahan keluar. Lebih banyak bendera

Jika ada kesalahan itu akan segera keluar.

$? adalah status keluar dari perintah masa lalu. Di Linux status keluar dari 0 berarti bahwa perintah itu berhasil. Status lain apa pun berarti kesalahan terjadi.

egrep "^ username" / etc / passwd> / dev / null Akan mencari nama pengguna di bawah file / etc / passwd. Jika menemukannya maka status keluar $? akan sama dengan 0. Jika tidak menemukannya status keluar akan menjadi sesuatu yang lain (bukan 0), maka Anda akan "gema tidak ada".


sumber
Selain itu, Anda dapat membuat skrip berfungsi dengan benar tanpa -e dengan mengganti dua baris pertama dengan if egrep "^username" /etc/passwd >/dev/null.
1
Mengapa tidak setdiperlukan? : - /
1
@ pst: Karena -ediberikan ke bash sebagai argumen baris perintah. Semua opsi yang tercantum di bawah setjuga diterima oleh bash di baris perintahnya - catat kalimat pertama di bagian Opsi pada halaman manual.
grawity
14

Semua sakelar baris perintah bash didokumentasikan di man bash.

      -e Segera keluar jika saluran pipa (yang mungkin terdiri dari a
              perintah sederhana tunggal), perintah subkulit terlampir di
              kurung, atau salah satu perintah yang dijalankan sebagai bagian dari
              daftar perintah yang dilingkupi oleh kawat gigi (lihat SHELL GRAMMAR
              di atas) keluar dengan status tidak nol. Shell tidak
              keluar jika perintah yang gagal adalah bagian dari perintah
              daftar segera setelah beberapa saat atau sampai kata kunci,
              bagian dari tes mengikuti if atau elif reserved
              kata-kata, bagian dari perintah apa pun yang dijalankan di && atau || daftar
              kecuali perintah yang mengikuti akhir && atau ||, apa saja
              perintah dalam pipa tetapi yang terakhir, atau jika perintah itu
              nilai balik sedang terbalik dengan! Jebakan pada ERR,
              jika diatur, dijalankan sebelum shell keluar. Pilihan ini
              berlaku untuk lingkungan shell dan setiap lingkungan subkulit
              ronment secara terpisah (lihat LINGKUNGAN PERILAKU PERINTAH
              di atas), dan dapat menyebabkan subkulit keluar sebelum mengeksekusi
              semua perintah dalam subkulit.
Greg Hewgill
sumber
2
Ahh. Saya mencarinya pada pria itu, tetapi setelah menemukan -e dalam file tes dan tidak -e di bawah argumen utama saya menyerah. Kutipan yang bagus. Mengapa tidak setdiperlukan? : - /
1

Script Anda salah, karena

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

keluar dari status 0 - rata-rata - semuanya OK, dalam kasus grep berarti "OK, temukan string". status keluar! = 0 berarti ada yang salah, dalam kasus grep 1 berarti, "tidak ditemukan", 2 berarti "tidak dapat membuka input" ...

jm666
sumber