Jakie jest znaczenie $? w skrypcie powłoki?


Odpowiedzi:



26

Odpowiedź Cjm jest poprawna, ale $?może być używana w niemądry sposób w skryptach powłoki i chciałbym ostrzec przed tym. Wiele złych skryptów powłoki ma powtarzający się wzór kodu:

run_some_command
EXIT_STATUS=$?

if [ "$EXIT_STATUS" -eq "0" ]
then
    # Do work when command exists on success
else
    # Do work for when command has a failure exit
fi

Jeśli to w ogóle możliwe (czasem dotyczy to czytelności), należy zakodować tę sytuację inaczej:

if run_some_command
then
    # Do work when command exists on success
else
    # Do failure exit work
fi

To ostatnie użycie jest szybsze, nie zanieczyszcza przestrzeni nazw zmiennych powłoki wielkościami zmiennymi temp, często może być o wiele bardziej czytelne dla ludzi i zachęca do stosowania „logiki pozytywnej”, praktyki pisania warunkowej bez negacji, która ma funkcje poznawcze prostota w większości sytuacji. W $?większości eliminuje to użycie .


5
Bardziej skomplikowana składnia jest konieczna, gdy jest więcej możliwości niż tylko 0 lub 1 - programy często przekazują przydatne informacje za pomocą kodów wyjścia. Jest także przydatny, jeśli chcesz ponownie użyć tej wartości w kodzie (na przykład do logowania).
mattdm,

3

Oprócz tego, co powiedział cjm , jeśli wartość $?wynosi 0, to poprzedni proces zakończył się normalnie (lub pomyślnie). W przeciwnym razie wystąpił błąd.


8
Nie zawsze oznacza to błąd. diffkończy się z 0, jeśli porównywane pliki są takie same, z 1, jeśli są różne, a 2 oznacza błąd.
Shawn J. Goff

2
To nigdy nie sygnalizuje błąd. Jest to tylko status wyjścia poprzedniego polecenia. Sprawa „0, jeśli normalne wyjście” jest konwencją (EXIT_SUCCESS / EXIT_FAILURE)
aviraldg

3

$?-Status wyjścia ostatniego wykonanego polecenia.

$0-Nazwa bieżącego skryptu.

$#- Liczba argumentów dostarczonych do skryptu.

$$-Numer procesu bieżącej powłoki. W przypadku skryptów powłoki jest to identyfikator procesu, w ramach którego są one wykonywane.


0

$? podaj nam status wykonania ostatniego polecenia wykonania po znaku zachęty. Wartość „0” oznacza, że ​​polecenie zostało wykonane pomyślnie, a „1” oznacza brak powodzenia.


2
Nie tylko w interaktywnych monitach, ale także w skryptach, a każda niezerowa wartość oznacza niepowodzenie.
Kusalananda

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.