Cosa fa il -e in una bash shebang?

Ho uno script bash con quanto segue:

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

Questo script non lo farà corri senza -e. Che cosa fa -e per questo script? Inoltre, cosa fa $? in questo contesto?

Commenti

  • Odd. No -e nella pagina man (voglio davvero vedere una risposta che affronti questo). $? contiene lultimo codice di uscita (quello del egrep processo generato sopra).
  • @pst: -e è documentato in set.
  • Puoi semplificare lo script in questo modo: if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • ' manca uno spazio tra if e [. Questo script non ' funzionerà con -e, perché se grep ' non trova nulla, quindi in -e lo script terminerà immediatamente. Senza -e, ' hai ricevuto il messaggio al contrario: uno stato ($?) di 0 significa che grep ha trovato lutente. Tieni presente che questo dovrebbe essere “grep ' ^ nome utente: ', a proposito (cosa succede se ' è un altro utente con un nome più lungo?).
  • #/bin/bash -e avrà lo stesso effetto di #/bin/bash sulla riga # 1 e set -e sulla riga # 2?

Risposta

Il tuo post contiene effettivamente 2 domande.

  1. Il flag -e indica allo script di uscire in caso di errore. Altri flag

    Se si verifica un errore, verrà chiuso immediatamente.

  2. $? è lo stato di uscita dellultimo comando. In Linux uno stato di uscita di 0 significa che il comando ha avuto successo. Qualsiasi altro stato significherebbe che si è verificato un errore.

Per applicare queste risposte al tuo script:

egrep "^username" /etc/passwd >/dev/null 

cercherà username nel file /etc/passwd.

  • Se lo trova allora lo stato di uscita $? sarà uguale a 0.

  • In caso contrario “Per scoprire che lo stato di uscita sarà qualcosaltro (non 0). Qui, dovrai eseguire la parte echo "doesn"t exist" del codice.

Sfortunatamente cè un errore nel tuo script, e dovresti eseguire quel codice se lutente esiste – cambia la riga in

if [ $? -ne 0 ] 

per ottenere la logica corretta.

Tuttavia se lutente non lo fa “t exist, egrep restituirà un errore c ode, ea causa dellopzione -e la shell uscirà immediatamente dopo quella riga, quindi non raggiungerai mai quella parte del codice.

Commenti

  • Inoltre, puoi far funzionare correttamente lo script senza -e sostituendo le prime due righe con if egrep "^username" /etc/passwd >/dev/null.
  • Perché non è richiesto set? : – /
  • @pst: perché -e viene fornito a bash come argomento della riga di comando. Tutte le opzioni elencate in set sono accettate anche da bash nella sua riga di comando – nota la prima frase nella sezione Opzioni del manuale pagina.

Risposta

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

 -e Exit immediately if a pipeline (which may consist of a single simple command), a subshell command enclosed in parentheses, or one of the commands executed as part of a command list enclosed by braces (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command"s return value is being inverted with !. A trap on ERR, if set, is executed before the shell exits. This option applies to the shell environment and each subshell envi- ronment separately (see COMMAND EXECUTION ENVIRONMENT above), and may cause subshells to exit before executing all the commands in the subshell. 

Commenti

  • Ahh. Lho cercato nelluomo, ma dopo aver trovato -e nel file tests e no -e sotto gli argomenti principali ho rinunciato. Bel brano. Perché non è richiesto set? : – /

Risposta

Il tuo script non è corretto, perché

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

exit status 0 – significa – è tutto OK, nel caso di grep significa” OK, ho trovato la stringa “. stato di uscita! = 0 significa che qualcosa non va, nel caso di grep 1 significa “non trovato”, 2 significa “non posso” aprire linput “…

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *