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 .

Bruce Ediger
źródło
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.

Barun
źródło
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.

Midhun S Sivan
źródło
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.

Rahul Arora
źródło
2
Nie tylko w interaktywnych monitach, ale także w skryptach, a każda niezerowa wartość oznacza niepowodzenie.
Kusalananda
-3

$?określa status wyjścia wykonanego polecenia. $następnie liczby (na przykład $1, $2itp) przedstawia parametry w skrypcie.

harika
źródło
Możesz przeczytać poprawną odpowiedź ...
jasonwryan