Váš příspěvek ve skutečnosti obsahuje 2 otázky.
-
-epříznak dává skriptu pokyn k ukončení při chybě. Další příznakyPokud dojde k chybě, okamžitě se ukončí.
-
$?je výstupní stav posledního příkazu. V Linuxu 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
by hledal username v /etc/passwd soubor.
-
Pokud jej nalezne, pak stav ukončení
$?bude rovno0. -
Pokud jej nenajde, bude stav ukončení jiný (ne
0). Zde budete chtít spustitecho "doesn't exist"část kódu.
Bohužel ve vašem skriptu je chyba a tento kód byste provedli pokud uživatel existuje - změňte řádek na
if [ $? -ne 0 ]
abyste pochopili správnou logiku.
Nicméně pokud uživatel neexistuje, egrep vrátí kód chyby a kvůli -e shell se po tomto řádku okamžitě ukončí, takže byste se k této části kódu nikdy nedostali.
Všechny přepínače příkazového řádku bash jsou popsá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.