Ce face -e într-un bash shebang?

Am un script bash cu următoarele:

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

Acest script nu va fi alergă fără -e. Ce face -e pentru acest script? De asemenea, ce face $? în acest context?

Comentarii

  • Impar. Nu -e în pagina de manual (chiar vreau să văd un răspuns adresând acest lucru). $? conține ultimul cod de ieșire (cel al procesului egrep generat mai sus).
  • @pst: -e este documentat la set.
  • Puteți simplifica scriptul procedând astfel: if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • ' lipsește un spațiu între if și [. Acest script a câștigat ' să nu funcționeze cu -e, deoarece dacă grep nu ' nu găsește nimic, apoi sub -e scriptul se va termina chiar acolo. Fără -e, ' ați primit mesajul înapoi: o stare ($?) de 0 înseamnă că grep a găsit utilizatorul. Rețineți că acesta ar trebui să fie `grep ' ^ nume de utilizator: ', apropo (ce se întâmplă dacă există ' este un alt utilizator cu un nume mai lung?).
  • Va avea #/bin/bash -e același efect ca #/bin/bash pe linia # 1 și set -e pe linia # 2?

Răspunde

Postarea dvs. conține de fapt 2 întrebări.

  1. Semnalizatorul -e instruiește scriptul să iasă din eroare. Mai multe steaguri

    Dacă există o eroare, va ieși imediat.

  2. $? este starea de ieșire a ultimei comenzi. În Linux, starea de ieșire 0 înseamnă că comanda a avut succes. Orice altă stare ar însemna o eroare.

Pentru a aplica aceste răspunsuri scriptului:

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

ar căuta username în fișierul /etc/passwd.

  • Dacă îl găsește atunci starea de ieșire $? va fi egală cu 0.

  • Dacă nu „Nu găsesc că starea de ieșire va fi altceva (nu 0). Aici, veți dori să executați partea echo "doesn"t exist" a cod.

Din păcate, există o eroare în scriptul dvs., și ați executa acel cod dacă utilizatorul există – schimbați linia în

if [ $? -ne 0 ] 

pentru a obține corecta logică.

Cu toate acestea, dacă utilizatorul nu „nu există, egrep va returna o eroare c oda și, datorită opțiunii -e, shell-ul va ieși imediat după acea linie, astfel încât să nu ajungeți niciodată la acea parte a codului.

Comentarii

  • În plus, puteți face scriptul să funcționeze corect fără -e înlocuind primele două linii cu if egrep "^username" /etc/passwd >/dev/null.
  • De ce nu este necesar totuși set? : – /
  • @pst: Deoarece -e este dat lui bash ca argument de linie de comandă. Toate opțiunile listate în set sunt acceptate de bash în linia sa de comandă – notați prima teză din secțiunea Opțiuni a manualului pagina.

Răspuns

Toate comutatoarele din linia de comandă bash sunt documentate în 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. 

Comentarii

  • Ahh. L-am căutat la om, dar după ce am găsit -e în testele de dosar și nu -e sub principalele argumente am renunțat. Frumos fragment. De ce nu este necesar totuși set? : – /

Răspuns

Scriptul dvs. este incorect, deoarece

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

starea de ieșire 0 – medie – totul este OK, în cazul grep înseamnă” OK, am găsit șirul „. starea de ieșire! = 0 înseamnă că ceva nu este în regulă, în cazul grep 1 înseamnă „nu a fost găsit”, 2 înseamnă „nu se poate deschide intrarea” …

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *