Cosa fa il -e in un bash shebang?


32

Ho uno script bash con il seguente:

#!/bin/bash -e

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

Questo script non verrà eseguito senza -e. Cosa fa -equesto script? Inoltre, cosa fa $?in questo contesto?


1
Dispari. No -enella pagina man (voglio davvero vedere una risposta indirizzare questo). $?contiene l'ultimo codice di uscita (quello del egrepprocesso generato sopra).

2
@pst: -eè documentato sotto set.
Greg Hewgill,

Puoi semplificare la tua sceneggiatura in questo modo:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan,

2
Ti manca uno spazio tra ife [. Questo script non funziona con -e , perché se grepnon trova nulla poi sotto -elo script terminerà proprio lì. Senza -e, hai il messaggio al contrario: uno status ( $?) di 0 significa che grep ha trovato l'utente. Si noti che questo dovrebbe essere `grep '^ username:', a proposito (e se ci fosse un altro utente con un nome più lungo?).
Gilles 'SO- smetti di essere malvagio' il

3
Avrà #/bin/bash -elo stesso effetto #/bin/bashdella linea 1 e set -edella linea 2?
blong,

Risposte:


34

Errore di uscita. Più bandiere

Se si verifica un errore, uscirà immediatamente.

$? è lo stato di uscita del comando precedente. In Linux uno stato di uscita pari a 0 indica che il comando ha avuto esito positivo. Qualsiasi altro stato significherebbe che si è verificato un errore.

egrep "^ username" / etc / passwd> / dev / null Cerca il nome utente nel file / etc / passwd. Se lo trova, lo stato di uscita $? sarà uguale a 0. Se non lo trova lo stato di uscita sarà qualcos'altro (non 0), quindi "l'eco non esiste".


Inoltre, puoi far funzionare correttamente lo script senza -e sostituendo le prime due righe con if egrep "^username" /etc/passwd >/dev/null.

1
Perché non è setrichiesto però? : - /

1
@pst: Perché -eviene dato a bash come argomento da riga di comando. Tutte le opzioni elencate di seguito setsono accettate anche da bash nella sua riga di comando. Nota la prima frase nella sezione Opzioni della pagina del manuale.
Grawity

14

Tutte le opzioni della riga di comando bash sono documentate in man bash.

      -e Esci immediatamente se una pipeline (che può consistere in a
              singolo comando semplice), un comando subshell racchiuso in
              parentesi o uno dei comandi eseguiti come parte di
              un elenco di comandi racchiuso tra parentesi graffe (vedere SHELL GRAMMAR
              sopra) esce con uno stato diverso da zero. La shell no
              esce se il comando che fallisce fa parte del comando
              elenco immediatamente dopo un po 'o fino alla parola chiave,
              parte del test che segue il if o elif riservato
              parole, parte di qualsiasi comando eseguito in && o || elenco
              eccetto il comando che segue l'ultimo && o ||, qualsiasi
              comando in una pipeline ma l'ultimo, o se il comando è
              il valore di ritorno viene invertito con!. Una trappola su ERR,
              se impostato, viene eseguito prima della chiusura della shell. Questa opzione
              si applica all'ambiente shell e ad ogni ambiente subshell
              ronment separatamente (vedi AMBIENTE DI ESECUZIONE DEI COMANDI
              sopra) e può causare la chiusura delle sottostrutture prima dell'esecuzione
              tutti i comandi nella subshell.

2
Ahh. L'ho cercato nell'uomo, ma dopo aver trovato -e nei test dei file e no -e sotto gli argomenti principali ho rinunciato. Bel estratto. Perché non è setrichiesto però? : - /

1

La tua sceneggiatura non è corretta, perché

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

exit status 0 - mean - tutto è OK, nel caso di grep significa "OK, ho trovato la stringa". exit status! = 0 significa che qualcosa non va, nel caso di grep 1 significa "non trovato", 2 significa "impossibile aprire input" ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.