Co to jest „$?”? Czy to zmienna?

23

Pytanie jest dość proste. Mogę uzyskać kod wyjścia poprzedniego polecenia za pomocą $?. Ale co to właściwie jest?

Nie sądzę, że jest to zmienna, ponieważ nie możesz mieć żadnych znaków specjalnych w nazwie zmiennej innej niż _.

foo?foo=10

spowoduje błąd: foo?foo=10: command not found

Więc jeśli nie jest to zmienna, co to jest? Czy są tacy inni?

daltonfury42
źródło
6
stackoverflow.com/questions/6834487/ ... proszę bardzo :)
RiddleMeThis

Odpowiedzi:

23

Co to jest?

$? jest wbudowaną zmienną, która przechowuje status wyjścia polecenia, funkcji lub samego skryptu.

$?odczytuje status wyjścia ostatniego wykonanego polecenia. Po powrocie funkcji $?podaje status wyjścia ostatniego polecenia wykonanego w funkcji. W ten sposób Bash nadaje funkcjom „wartość zwracaną”. Zwraca 0w przypadku sukcesu lub liczbę całkowitą w zakresie 1 - 255w przypadku błędu.

Czy są też tacy inni?

Tak, istnieje kilka takich wbudowanych zmiennych w bash. Możesz zobaczyć listę tutaj . Patrz: http://www.tldp.org/LDP/abs/html/exit-status.html

Ron
źródło
1
Więc jest dostępny tylko w powłoce bash?
daltonfury42
4
@ daltonfury42 nie, każda powłoka że próby mieć jakąś zgodność z Bourne shell będzie ją wspierać (w tym dash, ksh, zsh, między innymi).
muru
2
csh i ryby używają $statusdo tego samego celu
glenn jackman
22

$?jest zmienną, ale specjalną, dlatego znaki specjalne są dozwolone. ($?)Rozwija się do statusu wyjścia ostatnio wykonanego potoku pierwszego planu.

Nie jest to jedyny, powłoka specjalnie traktuje kilka parametrów. Do tych parametrów można się jedynie odwoływać; przypisanie do nich jest niedozwolone:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

Źródła:

Sylvain Pineau
źródło
2
"$*"to nie tylko wszystkie parametry pozycyjne jako pojedyncze słowo, ale wszystkie parametry pozycyjne oddzielone pierwszym znakiem IFSjako pojedyncze słowo. Ponieważ wynik nie będzie cytowany, będzie podlegał podziałowi pola, więc efekt jest taki, jak $@w przypadku niecytowanym.
muru
1
Dla pewności: bez cudzysłowu $ @ i $ * są takie same, ponieważ oba są podzielone na słowa. Cytując „$ @” zachowuje podział słowa parametrów pozycyjnych, nawet jeśli pojedynczy parametr zawiera znak w IFS.
kojiro
1
Czy istnieje odniesienie od kiedy to jest używane do powłok? Zastanawiam się, czy Perl wziął je ze skryptów powłoki.
simbabque,
To wyprzedza Perla o dziesięciolecia (lub co najmniej lata). Wiele składni Perla było pod wpływem składni powłoki. (Perl urodził się w 1987 roku i wiele z tej składni pochodzi z oryginalnej powłoki Bourne'a (1977). Nie jestem w 100% w momencie wprowadzenia $ _, ale prawie na pewno było to na długo przed 1987 rokiem.
Popup
6

$?to specjalny parametr powłoki (zmienny).

Zasadniczo wszystkie zmienne zdefiniowane przez użytkownika muszą być nazwane przy użyciu tylko znaków z klasy znaków [:alnum:]tj. [a-zA-Z0-9_](Także nie można zaczynać od [0-9]).

Krótko mówiąc, $?jest to specjalna zmienna ( a jest ich całkiem sporo ), którą można uznać za wewnętrzną cechę samej powłoki, która zapewnia kod wyjściowy poprzedniej komendy (czy się to powiodło, czy nie).

Możesz to przeczytać, aby uzyskać więcej informacji na temat zmiennych.

heemayl
źródło
4

$?jest specjalną zmienną w bash, która zawsze przechowuje kod powrotu / wyjścia ostatnio wykonanej komendy.

Możesz go wyświetlić w terminalu, uruchamiając echo $?.

Kody zwrotne są w zakresie [0; 255].
Kod powrotu 0zwykle oznacza, że ​​wszystko jest w porządku.
Inne wartości wskazują na błędy. Większość aplikacji zwraca 1lub wartości niestandardowe. Jeśli polecenie nie zostanie znalezione, zmienna zwykle zawiera127

Jeśli chcesz ustawić tę zmienną na określoną wartość, możesz to łatwo zrobić za pomocą, bash -c "exit 5"aby na przykład zwrócić kod powrotu 5.

Bajt Dowódca
źródło
Funkcja powłoki to zgodny ze standardem POSIX sposób ustawiania statusu wyjścia bez konieczności rozwidlania. setstatus() { return 5; }
kojiro,