Hva gjør -e i en bash shebang?

Jeg har et bash-skript med følgende:

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

Dette skriptet vil ikke løp uten -e. Hva gjør -e for dette skriptet? Hva gjør $? også i denne sammenheng?

Kommentarer

  • Odd. Ingen -e på mannssiden (jeg vil virkelig se et svar adressere dette). $? inneholder den siste utgangskoden (den for egrep -prosessen som er skapt ovenfor).
  • @pst: -e er dokumentert under set.
  • Du kan forenkle skriptet ditt ved å gjøre dette: if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • Du ' mangler et mellomrom mellom if og [. Dette skriptet vant ' t med -e, for hvis grep finner ' ikke noe, så under -e skriptet avsluttes akkurat der. Uten -e har du ' fått meldingen bakover: en status ($?) av 0 betyr at grep fant brukeren. Merk at dette forresten skal være `grep ' ^ brukernavn: ' (hva om det ' er en annen bruker med et lengre navn?).
  • Vil #/bin/bash -e ha samme effekt som #/bin/bash på linje nr. 1 og set -e på linje nr. 2?

Svar

Innlegget ditt inneholder faktisk to spørsmål.

  1. -e -flagget instruerer skriptet om å avslutte ved feil. Flere flagg

    Hvis det er en feil, vil den gå ut med en gang.

  2. $? er utgangsstatus for den siste kommandoen. I Linux betyr en utgangsstatus på 0 at kommandoen var vellykket. Enhver annen status vil bety at det oppstod en feil.

Slik bruker du svarene på skriptet ditt:

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

vil se etter username i /etc/passwd -filen.

  • Hvis den finner den da vil utgangsstatusen $? være lik 0.

  • Hvis den ikke «t finner det at utgangsstatusen vil være noe annet (ikke 0). Her vil du utføre echo "doesn"t exist" delen av kode.

Dessverre er det en feil i skriptet ditt, og du vil utføre den koden hvis brukeren eksisterer – endre linjen til

if [ $? -ne 0 ] 

for å få logikken riktig.

Imidlertid hvis brukeren ikke «t eksisterer, egrep vil returnere en feil c ode, og på grunn av -e alternativet, vil skallet umiddelbart gå ut etter den linjen, slik at du aldri kommer til den delen av koden.

Kommentarer

  • I tillegg kan du få skriptet til å fungere riktig uten -e ved å erstatte de to første linjene med if egrep "^username" /etc/passwd >/dev/null.
  • Hvorfor kreves ingen set skjønt? : – /
  • @pst: Fordi -e er gitt til bash som et kommandolinjeargument. Alle alternativene oppført under set godtas også av bash i kommandolinjen – merk den første setningen i seksjonen Alternativer i håndboken side.

Svar

Alle bash-kommandolinjebryterne er dokumentert i 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. 

Kommentarer

  • Ahh. Jeg så etter det hos mannen, men etter å ha funnet -e i filtestene og nei -e under hovedargumentene ga jeg opp. Fint utdrag. Hvorfor kreves ingen set? : – /

Svar

Skriptet ditt er feil, fordi

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

exit status 0 – mener – alt er OK, i tilfelle grep betyr» OK, fant strengen «. exit status! = 0 betyr at noe er galt, i tilfelle grep 1 betyr «ikke funnet», 2 betyr «kan ikke åpne inngang» …

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *