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
-e
geeft 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 van0
dat 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
set
vereist? : – / - @pst: Omdat de
-e
aan bash wordt gegeven als een opdrachtregelargument. Alle opties vermeld onderset
worden 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
set
vereist? : – /
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 “…
-e
in de man-pagina (ik wil echt een antwoordadres zien).$?
bevat de laatste afsluitcode (die van hetegrep
proces dat hierboven is voortgebracht).-e
wordt gedocumenteerd onderset
.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
if
en[
. Dit script werkt niet ' met-e
, want ifgrep
kan ' niets vinden en onder-e
zal 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 -e
hetzelfde effect hebben als#/bin/bash
on line # 1 enset -e
on line # 2?