Ik heb een bash-script met het volgende:
#!/bin/bash -e egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then echo "doesn"t exist" fi
Dit script zal niet ren zonder de -e. Wat doet de -e voor dit script? En wat doet de $? in deze context?
Reacties
Answer
Je bericht bevat eigenlijk 2 vragen.
-
De vlag
-egeeft het script opdracht om bij een fout af te sluiten. Meer vlaggenAls er een fout optreedt, wordt deze onmiddellijk afgesloten.
-
De
$?is de afsluitstatus van de laatste opdracht. In Linux betekent een exit-status van0dat de opdracht succesvol was. Elke andere status zou betekenen dat er een fout is opgetreden.
Om deze antwoorden op uw script toe te passen:
egrep "^username" /etc/passwd >/dev/null
zoekt naar username in het /etc/passwd -bestand.
-
Als het het vindt dan is de exitstatus
$?gelijk aan0. -
Als dat niet het geval is “Ik vind het niet dat de exit-status iets anders zal zijn (niet
0). Hier wil je hetecho "doesn"t exist"deel van de code.
Helaas zit er een fout in uw script, en je zou die code uitvoeren als de gebruiker bestaat – verander de regel in
if [ $? -ne 0 ]
om de juiste logica te krijgen.
als de gebruiker dat niet doet “t exist, egrep retourneert een fout c ode, en vanwege de -e optie zal de shell onmiddellijk na die regel afsluiten, dus je zou nooit dat deel van de code bereiken.
Opmerkingen
- Bovendien kunt u het script correct laten werken zonder de -e door de eerste twee regels te vervangen door
if egrep "^username" /etc/passwd >/dev/null. - Waarom is er geen
setvereist? : – / - @pst: Omdat de
-eaan bash wordt gegeven als een opdrachtregelargument. Alle opties vermeld ondersetworden ook geaccepteerd door bash in de opdrachtregel – let op de eerste zin in sectie Opties van de handleiding pagina.
Answer
Alle bash-opdrachtregelopties zijn gedocumenteerd 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.
Reacties
- Ahh. Ik zocht het in de man, maar nadat ik -e had gevonden in de bestandstests en nee -e onder de belangrijkste argumenten, gaf ik het op. Leuk fragment. Waarom is er echter geen
setvereist? : – /
Antwoord
Uw script is onjuist, omdat
egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then #echo "doesn"t exist" # WRONG echo "the USER EXISTS" fi
exit status 0 – gemiddelde – alles is in orde, in het geval van grep betekent” OK, vond de string “. exit-status! = 0 betekent dat er iets mis is, in het geval van grep betekent 1, “niet gevonden”, 2 betekent “kan” invoer niet openen “…
-ein de man-pagina (ik wil echt een antwoordadres zien).$?bevat de laatste afsluitcode (die van hetegrepproces dat hierboven is voortgebracht).-ewordt gedocumenteerd onderset.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fiifen[. Dit script werkt niet ' met-e, want ifgrepkan ' niets vinden en onder-ezal het script daar eindigen. Zonder-e, heb je ' het bericht achterstevoren gekregen: een status ($?) van 0 betekent dat grep de gebruiker heeft gevonden. Merk op dat dit trouwens `grep ' ^ gebruikersnaam: ' moet zijn (wat als er ' is een andere gebruiker met een langere naam?).#/bin/bash -ehetzelfde effect hebben als#/bin/bashon line # 1 enset -eon line # 2?