Wat doet de -e in een bash-shebang?

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

  • Vreemd. Geen -e in de man-pagina (ik wil echt een antwoordadres zien). $? bevat de laatste afsluitcode (die van het egrep proces dat hierboven is voortgebracht).
  • @pst: -e wordt gedocumenteerd onder set.
  • Je zou je script kunnen vereenvoudigen door dit te doen: if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • U ' mist een spatie tussen if en [. Dit script werkt niet ' met -e, want if grep 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?).
  • Zal #/bin/bash -e hetzelfde effect hebben als #/bin/bash on line # 1 en set -e on line # 2?

Answer

Je bericht bevat eigenlijk 2 vragen.

  1. De vlag -e geeft het script opdracht om bij een fout af te sluiten. Meer vlaggen

    Als er een fout optreedt, wordt deze onmiddellijk afgesloten.

  2. De $? is de afsluitstatus van de laatste opdracht. In Linux betekent een exit-status van 0 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 aan 0.

  • Als dat niet het geval is “Ik vind het niet dat de exit-status iets anders zal zijn (niet 0). Hier wil je het echo "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 onder set 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 “…

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *