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
Răspunde
Postarea dvs. conține de fapt 2 întrebări.
-
Semnalizatorul
-e
instruiește scriptul să iasă din eroare. Mai multe steaguriDacă există o eroare, va ieși imediat.
-
$?
este starea de ieșire a ultimei comenzi. În Linux, starea de ieșire0
î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ă cu0
. -
Dacă nu „Nu găsesc că starea de ieșire va fi altceva (nu
0
). Aici, veți dori să executați parteaecho "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 înset
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” …
-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 procesuluiegrep
generat mai sus).-e
este documentat laset
.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
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?).#/bin/bash -e
același efect ca#/bin/bash
pe linia # 1 șiset -e
pe linia # 2?