Hvad gør -e i en bash shebang?

Jeg har et bash-script med følgende:

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

Dette script vil ikke køre uden -e. Hvad gør -e til dette script? Hvad gør $? også i denne sammenhæng?

Kommentarer

  • Odd. Ingen -e på mandsiden (jeg vil virkelig se et svar adressere dette). $? indeholder den sidste udgangskode (den for egrep -processen, der er skabt ovenfor).
  • @pst: -e er dokumenteret under set.
  • Du kan forenkle dit script ved at gøre dette: if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • Du ' mangler et mellemrum mellem if og [. Dette script vandt ' t arbejde med -e, for hvis grep finder ' ikke noget, så under -e scriptet afsluttes lige der. Uden -e har du ' beskeden bagud: en status ($?) af 0 betyder, at grep faktisk fandt brugeren. Bemærk, at dette forresten skal være `grep ' ^ brugernavn: ' (hvad hvis der ' er en anden bruger med et længere navn?).
  • Vil #/bin/bash -e have den samme effekt som #/bin/bash på linje nr. 1 og set -e på linje nr. 2?

Svar

Dit indlæg indeholder faktisk to spørgsmål.

  1. -e -flaget instruerer scriptet om at afslutte ved fejl. Flere flag

    Hvis der er en fejl, afslutter den med det samme.

  2. $? er udgangsstatus for den sidste kommando. I Linux betyder en exitstatus på 0, at kommandoen var vellykket. Enhver anden status ville betyde, at der opstod en fejl.

For at anvende disse svar på dit script:

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

ville se efter username i /etc/passwd filen.

  • Hvis den finder den så vil udgangsstatus $? være lig med 0.

  • Hvis den ikke “t finder det, at udgangsstatus vil være noget andet (ikke 0). Her vil du udføre echo "doesn"t exist" -delen af kode.

Desværre der er en fejl i dit script, og du ville udføre den kode hvis brugeren findes – skift linjen til

if [ $? -ne 0 ] 

for at få logikken rigtig.

Dog hvis brugeren ikke “t eksisterer, egrep returnerer en fejl c ode, og på grund af -e -indstillingen forlader skallen straks efter denne linje, så du når aldrig den del af koden.

Kommentarer

  • Derudover kan du få scriptet til at fungere korrekt uden -e ved at erstatte de to første linjer med if egrep "^username" /etc/passwd >/dev/null.
  • Hvorfor kræves der dog ingen set? : – /
  • @pst: Fordi -e gives til bash som et kommandolinjeargument. Alle indstillinger, der er anført under set accepteres også af bash i kommandolinjen – bemærk første sætning i sektion Indstillinger i manualen side.

Svar

Alle bash kommandolinjekontakter er dokumenteret 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 ledte efter det hos manden, men efter at have fundet -e i filtestene og nej -e under de vigtigste argumenter opgav jeg. Dejligt uddrag. Hvorfor kræves der dog ingen set? : – /

Svar

Dit script er forkert, fordi

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

exit status 0 – betyder – alt er OK, i tilfælde af grep betyder” OK, fundet strengen “. exit status! = 0 betyder noget er forkert, i tilfælde af grep 1 betyder “ikke fundet”, 2 betyder “kan ikke åbne input” …

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *