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
-edá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í0znamená, ž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í
setvyžadován? : – / - @pst: Protože
-ese dává bash jako argument příkazového řádku. Všechny možnosti uvedené vsetjsou 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í
setvyž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).-eje dokumentován vset.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fiifa[. Tento skript nebude ' pracovat s-e, protože pokudgrepnenajde ' nic, pak pod-eskript skončí právě tam. Bez-ejste 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 -emít stejný účinek jako#/bin/bashon line # 1 andset -eon line # 2?