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
Svar
Dit indlæg indeholder faktisk to spørgsmål.
-
-e
-flaget instruerer scriptet om at afslutte ved fejl. Flere flagHvis der er en fejl, afslutter den med det samme.
-
$?
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 med0
. -
Hvis den ikke “t finder det, at udgangsstatus vil være noget andet (ikke
0
). Her vil du udføreecho "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 underset
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” …
-e
på mandsiden (jeg vil virkelig se et svar adressere dette).$?
indeholder den sidste udgangskode (den foregrep
-processen, der er skabt ovenfor).-e
er dokumenteret underset
.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
if
og[
. Dette script vandt ' t arbejde med-e
, for hvisgrep
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?).#/bin/bash -e
have den samme effekt som#/bin/bash
på linje nr. 1 ogset -e
på linje nr. 2?