Co robi -e w bash shebang?

Mam skrypt bash zawierający następujące elementy:

#!/bin/bash -e egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then echo "doesn"t exist" fi 

Ten skrypt nie uruchomić bez -e. Co robi -e dla tego skryptu? Co robi $? w tym kontekście?

Komentarze

  • Dziwne. Brak -e na stronie podręcznika (naprawdę chcę zobaczyć odpowiedź na to). $? zawiera ostatni kod zakończenia (ten z procesu egrep wywołanego powyżej).
  • @pst: -e jest udokumentowane w set.
  • Możesz uprościć swój skrypt, wykonując następujące czynności: if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • ' brakuje spacji między if a [. Ten skrypt wygrał ' t działa z -e, ponieważ jeśli grep nie ' nie znajdzie niczego, a następnie w -e skrypt zakończy działanie. Bez -e ' otrzymałeś wiadomość wstecz: status ($?) z 0 oznacza, że grep znalazł użytkownika. Zwróć uwagę, że powinno to być `grep ' ^ username: ', nawiasem mówiąc (a co jeśli ' czy inny użytkownik ma dłuższą nazwę?).
  • Czy #/bin/bash -e przyniesie taki sam efekt jak #/bin/bash w linii 1 i set -e w linii 2?

Odpowiedź

Twój post zawiera w rzeczywistości 2 pytania.

  1. Flaga -e nakazuje skryptowi zakończenie pracy w przypadku błędu. Więcej flag

    Jeśli wystąpi błąd, zostanie on natychmiast zamknięty.

  2. $? to kod zakończenia ostatniego polecenia. W Linuksie status wyjścia 0 oznacza, że polecenie powiodło się. Każdy inny stan oznaczałby wystąpienie błędu.

Aby zastosować te odpowiedzi w swoim skrypcie:

egrep "^username" /etc/passwd >/dev/null 

szuka username w pliku /etc/passwd.

  • Jeśli znajdzie wtedy stan wyjścia $? będzie równy 0.

  • Jeśli tak się nie stanie „nie znajdź go, stan wyjścia będzie inny (nie 0). Tutaj będziesz chciał wykonać echo "doesn"t exist" część kod.

Niestety w Twoim skrypcie jest błąd, i wykonasz ten kod , jeśli użytkownik istnieje – zmień wiersz na

if [ $? -ne 0 ] 

aby uzyskać właściwą logikę.

Jednak jeśli użytkownik nie „t istnieje, egrep zwróci błąd c ode, a dzięki opcji -e powłoka natychmiast zakończy pracę po tej linii, więc nigdy nie dotrzesz do tej części kodu.

Komentarze

  • Ponadto możesz sprawić, że skrypt będzie działał poprawnie bez -e, zastępując pierwsze dwie linie z if egrep "^username" /etc/passwd >/dev/null.
  • Dlaczego jednak set nie jest wymagane? : – /
  • @pst: Ponieważ -e jest przekazany bashowi jako argument wiersza poleceń. Wszystkie opcje wymienione w set są również akceptowane przez basha w jego wierszu poleceń – zwróć uwagę na pierwsze zdanie w sekcji Opcje podręcznika

Odpowiedź

Wszystkie przełączniki wiersza poleceń bash są udokumentowane w 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. 

Komentarze

  • Ahh. Szukałem go w man, ale po znalezieniu -e w pliku testing i braku -e pod głównymi argumentami dałem sobie spokój. Niezły fragment. Dlaczego jednak nie jest wymagane set? : – /

Odpowiedź

Twój skrypt jest nieprawidłowy, ponieważ

egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then #echo "doesn"t exist" # WRONG echo "the USER EXISTS" fi 

status wyjścia 0 – oznacza – wszystko jest w porządku, w przypadku grep oznacza” OK, znalazłem ciąg „. status wyjścia! = 0 oznacza, że coś jest nie tak, w przypadku grep 1 oznacza „nie znaleziono”, 2 oznacza „nie można” otworzyć wejścia „…

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *