Czy „$”? Zmienna (znak zapytania dolara) dostępna tylko w powłoce Bash?

10

W Bashpowłoce mogę uzyskać status wyjścia polecenia poprzez $?zmienną:

# ps -ef | grep "haha"
root     15439 15345  0 23:02 pts/0    00:00:00 grep --color=auto haha
# echo $?
0

Czy jest dostępny tylko w powłoce Bash? Czy mogę też używać go w innych powłokach?

Nan Xiao
źródło
8
Możesz go użyć w dowolnej powłoce POSIX, jest to jeden ze specjalnych parametrów
cuonglm,
Powiązane: Domyślny kod wyjścia po zakończeniu procesu?
Stéphane Chazelas

Odpowiedzi:

19

Kod $?wyjścia jest wspólny dla każdej powłoki, która następuje po POSIX, i jest opisany w 2.5.2 Parametry specjalne :

?
Rozwija się do dziesiętnego statusu wyjścia ostatniego potoku (patrz Rurociągi ).

Thomas Dickey
źródło
5
Nie tylko powłoka POSIX, wszystkie powłoki podobne do Bourne'a, w tym skorupa Bourne'a (która, jak sądzę, była tą, która ją wprowadziła, skorupa Mashey miała ją, jak $rwierzę). To jest sh praktycznie wszystkich systemów uniksopodobnych od czasu Unixa V7 pod koniec lat 70. XX wieku. Większość innych powłok (csh, tcsh, fish, rc) ma to $status.
Stéphane Chazelas
2
I wiele języków skryptowych: Perl, Ruby itp.
OrangeDog
13

Jak powiedział Thomas Dickey, każda powłoka POSIX (tj. Prawie wszystkie z nich) będzie miała $?.

To pytanie bardzo mnie zainteresowało, więc przetestowałem je na dowolnej powłoce, którą mogłem zdobyć:

  • mksh
  • zsh
  • /bin/sh na moim Samsungu Galaxy S5
  • /bin/sh na moim routerze
  • tcsh
  • ksh
  • dash
  • /bin/sh na moim wirtualnym systemie UNIX V od około 1989 roku
  • cmd.exei powershell.exena moim komputerze z systemem Windows 10

i $?pracował we wszystkich, ale fishi cmd.exe.

Znaleziono dwie interesujące rzeczy:

1. $?działa w Windows PowerShell!

Do pewnego stopnia. Zamiast zwracać 0 lub wyższą liczbę, jest to po prostu Truei False.

PS C:\WINDOWS\system32> echo $?
True
PS C:\WINDOWS\system32> gfdhgfhfdgfdg
gfdhgfhfdgfdg : The term 'gfdhgfhfdgfdg' is not recognized as the name of a cmdlet, ...(big long error output).....
PS C:\WINDOWS\system32> echo $?
False

2. $?nie działa w powłoce fish.

Jednak podczas wpisywania $?ryb pojawia się następujący komunikat:

~$ echo $?
$? is not the exit status. In fish, please use $status.
fish: echo $?

Nie używałem go zbyt często, ale nie jestem zaskoczony, fishwydaje się , że ma swój własny interesujący język powłoki, zupełnie inny niż bashcokolwiek innego.

morelowy chłopiec
źródło
Większość muszli (fish, csh, tcsh, rc, zsh) używa, $statusco jest o wiele prostsze / czytelne IMO. Tylko powłoki podobne do Bourne'a (wśród powłok uniksowych) używają $?AFAIK.
Stéphane Chazelas
3
Zależy tylko od tego, jak czytasz. Czytałem w myślach $?jako „sh ## się stało?” a potem nigdy nie zapomniałem znaczenia tej specjalnej zmiennej :)
2
@nwildner lol! Myślę, że nigdy tego teraz nie zapomnę!
hanetzer