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
Odpowiedź
Twój post zawiera w rzeczywistości 2 pytania.
-
Flaga
-e
nakazuje skryptowi zakończenie pracy w przypadku błędu. Więcej flagJeśli wystąpi błąd, zostanie on natychmiast zamknięty.
-
$?
to kod zakończenia ostatniego polecenia. W Linuksie status wyjścia0
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ówny0
. -
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 wset
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 „…
-e
na stronie podręcznika (naprawdę chcę zobaczyć odpowiedź na to).$?
zawiera ostatni kod zakończenia (ten z procesuegrep
wywołanego powyżej).-e
jest udokumentowane wset
.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
if
a[
. Ten skrypt wygrał ' t działa z-e
, ponieważ jeśligrep
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ę?).#/bin/bash -e
przyniesie taki sam efekt jak#/bin/bash
w linii 1 iset -e
w linii 2?