Co robi
echo $?
znaczy w programowaniu powłoki?
shell
scripting
special-characters
Harshay Buradkar
źródło
źródło
Odpowiedzi:
To jest kod zakończenia ostatniego wykonanego polecenia.
Na przykład polecenie
true
zawsze zwraca stan0
ifalse
zawsze zwraca stan1
:Z instrukcji: (dostępne po wywołaniu
man bash
powłoki)Zgodnie z konwencją status wyjścia
0
oznacza sukces, a niezerowy status powrotu oznacza niepowodzenie. Dowiedz się więcej o statusach wyjścia na Wikipedii .Istnieją inne zmienne specjalne, takie jak ta, jak widać w tym podręczniku online: https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
źródło
$
i?
są to dwa różne parametry$?
, które nie pojawiają się na stronie podręcznika bash (1).$?
zwraca wartość wyjściową ostatnio wykonanego polecenia.echo $?
wypisuje tę wartość na konsoli. zero oznacza pomyślne wykonanie, podczas gdy wartości niezerowe są mapowane na różne przyczyny niepowodzenia.Dlatego podczas tworzenia skryptów; Zwykle używam następującej składni
Porównanie należy przeprowadzić na równych
0
lub nie równych0
.** Aktualizacja Na podstawie komentarza: Idealnie byłoby, gdybyś nie używał powyższego bloku kodu do porównania, zapoznaj się z komentarzami i wyjaśnieniami @tripleee.
źródło
cmd; if [ $? -eq 0 ]; then
powinno zostać zmienioneif cmd; then
. Sam cel odif
(i inne instrukcje sterujące przepływem w skorupkach) jest uruchomienie komendy i zbadać jej stan wyjścia.if cmd;
niektóre warunki mogą nie być zbyt czytelne, zwłaszcza gdy cmd odnosi się do innego skryptu.[ 1 ]
i[ 0 ]
oba są prawdziwe;[
bez operatora sprawdza, czy argument jest niepustym łańcuchem.vendor/bin/drush status bootstrap | grep -q $(vendor/bin/drush php-eval 'if (function_exists("t")) echo t("Successful");') &> /dev/null;
. Gdybym miał to umieścić w jednym wierszuif [ ... ]
, byłoby to strasznie nieczytelne. Planuję zapisać wynik tej linii w zmiennej, więc mogę tylko powiedziećif [ $drupal_installed -eq 0 ]
później.echo $? - Podaje STATUS WYJŚCIA ostatnio wykonanego polecenia . Ten STATUS WYJŚCIA najprawdopodobniej byłby liczbą z ZEREM oznaczającym sukces i jakąkolwiek wartością NIĄZ ZEROWĄ oznaczającą niepowodzenie
? - To jest jeden specjalny parametr / zmienna w bash.
$? - Podaje wartość przechowywaną w zmiennej „?”.
Niektóre podobne parametry specjalne w BASH to 1,2, *, # (zwykle widoczne w poleceniu echo jako $ 1, $ 2, $ *, $ #, itd.,).
źródło
Ma ostatni kod statusu (wartość wyjścia) polecenia.
źródło
Przykład statusu wyjścia minimalnego POSIX C.
Aby to zrozumieć
$?
, musisz najpierw zrozumieć koncepcję statusu zakończenia procesu, która jest zdefiniowana w POSIX . W systemie Linux:kiedy proces wywołuje
exit
wywołanie systemowe, jądro przechowuje wartość przekazaną do wywołania systemowego (aint
) nawet po zakończeniu procesu.Wywołanie systemowe wyjścia jest wywoływane przez funkcję
exit()
ANSI C i pośrednio, gdy robiszreturn
frommain
.proces, który wywołał wychodzący proces potomny (Bash), często z
fork
+exec
, może pobrać status wyjścia dziecka za pomocąwait
wywołania systemowegoRozważ kod Bash:
„Odpowiednik” języka C to:
false.c
bash.c
Skompiluj i uruchom:
Wynik:
W Bash, kiedy wciśniesz enter, następuje fork + exec + wait, jak powyżej, a następnie bash ustawia
$?
status zakończenia rozwidlonego procesu.Uwaga: w przypadku poleceń wbudowanych, takich jak
echo
proces, nie musi być spawnowany, a Bash ustawia tylko$?
0, aby symulować proces zewnętrzny.Normy i dokumentacja
POSIX 7 2.5.2 „Parametry specjalne” http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02 :
man bash
„Parametry specjalne”:ANSI C i POSIX zalecają, aby:
0
oznacza, że program się powiódłinne wartości: program w jakiś sposób zawiódł.
Dokładna wartość może wskazywać rodzaj awarii.
ANSI C nie definiuje znaczenia żadnych zmiennych, a POSIX określa wartości większe niż 125: Jakie jest znaczenie „POSIX”?
Bash używa statusu wyjścia dla
if
W Bash często
$?
niejawnie używamy statusu wyjścia do kontrolowaniaif
instrukcji, jak w:gdzie
true
jest programem, który po prostu zwraca 0.Powyższe jest równoważne z:
I w:
[
to tylko program o dziwnej nazwie (i wbudowanym Bash, który zachowuje się tak jak on) i1 = 1 ]
jego argumenty, zobacz także: Różnica między pojedynczymi i podwójnymi nawiasami kwadratowymi w Bashźródło
Z http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
źródło
Zobacz Podręcznik Bash w 3.4.2 Parametry specjalne :
Jest trochę trudny do znalezienia, ponieważ nie jest wymieniony jako
$?
(nazwa zmiennej to „tylko”?
). Zobacz też , oczywiście, sekcję o statusie wyjścia ;-)Miłego kodowania.
źródło
Wyprowadza wynik ostatniego wykonanego polecenia unixowego
źródło