Mám bash skript s následujícím:
#!/bin/bash -e egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then echo "doesn"t exist" fi
Tento skript nebude běž bez -e. Co pro tento skript dělá -e
? Co také v této souvislosti dělá $?
?
Komentáře
Answer
Váš příspěvek ve skutečnosti obsahuje 2 otázky.
-
Příznak
-e
dává skriptu pokyn k ukončení při chybě. Další příznakyPokud dojde k chybě, bude ihned ukončena.
-
$?
je stav ukončení posledního příkazu. V systému Linux stav ukončení0
znamená, že příkaz byl úspěšný. Jakýkoli jiný stav by znamenal, že došlo k chybě.
Chcete-li použít tyto odpovědi na svůj skript:
egrep "^username" /etc/passwd >/dev/null
vyhledá username
v souboru /etc/passwd
.
-
Pokud jej najde pak bude stav ukončení
$?
roven0
. -
Pokud tomu tak není „Nezjistíte, že stav ukončení bude něco jiného (ne
0
). Zde budete chtít spustitecho "doesn"t exist"
část kód.
Bohužel je ve vašem skriptu chyba, a spustili byste tento kód pokud uživatel existuje – změňte řádek na
if [ $? -ne 0 ]
pro získání logiky správně.
však pokud uživatel ne „neexistuje, egrep
vrátí chybu c ode a díky možnosti -e
se shell po tomto řádku okamžitě ukončí, takže byste se na tuto část kódu nikdy nedostali.
Komentáře
- Kromě toho můžete skript nastavit tak, aby fungoval správně bez znaku -e, když nahradíte první dva řádky znakem
if egrep "^username" /etc/passwd >/dev/null
. - Proč však není
set
vyžadován? : – / - @pst: Protože
-e
se dává bash jako argument příkazového řádku. Všechny možnosti uvedené vset
jsou bash přijaty také v jeho příkazovém řádku – všimněte si první věty v části Možnosti příručky stránka.
Odpověď
Všechny přepínače příkazového řádku bash jsou zdokumentovány v 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.
Komentáře
- Ahh. Hledal jsem to u muže, ale poté, co jsem v testech souboru našel -e a pod hlavními argumenty ne -e, vzdal jsem se. Pěkný výňatek. Proč však není
set
vyžadován? : – /
Odpověď
Váš skript je nesprávný, protože
egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then #echo "doesn"t exist" # WRONG echo "the USER EXISTS" fi
stav ukončení 0 – průměr – vše je v pořádku, v případě grep znamená“ OK, našel řetězec „. stav ukončení! = 0 znamená, že něco není v pořádku, v případě grep 1 znamená „nenalezeno“, 2 znamená „nelze“ otevřít vstup „…
-e
(opravdu chci vidět odpověď na tuto adresu).$?
obsahuje poslední výstupní kód (výše uvedený procesegrep
).-e
je dokumentován vset
.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
if
a[
. Tento skript nebude ' pracovat s-e
, protože pokudgrep
nenajde ' nic, pak pod-e
skript skončí právě tam. Bez-e
jste dostali ' zprávu zpět: stav ($?
) 0 znamená, že grep našel uživatele. Mimochodem, toto by mělo být `grep ' ^ username: ' (co když ' jiný uživatel s delším jménem?).#/bin/bash -e
mít stejný účinek jako#/bin/bash
on line # 1 andset -e
on line # 2?