Co dělá -e v bash shebangu?

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

  • Zvláštní. Na stránce manuálu není -e (opravdu chci vidět odpověď na tuto adresu). $? obsahuje poslední výstupní kód (výše uvedený proces egrep).
  • @pst: -e je dokumentován v set.
  • Skript můžete zjednodušit takto: if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • ' Chybí vám mezera mezi if a [. Tento skript nebude ' pracovat s -e, protože pokud grep 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?).
  • Bude #/bin/bash -e mít stejný účinek jako #/bin/bash on line # 1 and set -e on line # 2?

Answer

Váš příspěvek ve skutečnosti obsahuje 2 otázky.

  1. Příznak -e dává skriptu pokyn k ukončení při chybě. Další příznaky

    Pokud dojde k chybě, bude ihned ukončena.

  2. $? 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í $? roven 0.

  • Pokud tomu tak není „Nezjistíte, že stav ukončení bude něco jiného (ne 0). Zde budete chtít spustit echo "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é v set 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 „…

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *