Является ли «$?» (знак доллара) доступна только в оболочке Bash?

10

В Bashоболочке я могу получить статус выхода команды через $?переменную:

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

Это доступно только в оболочке Bash? Или я тоже могу использовать его в других оболочках?

Нань Сяо
источник
8
Вы можете использовать его в любой оболочке POSIX, это один из специальных параметров
cuonglm

Ответы:

19

Код $?выхода является общим для любой оболочки, которая следует за POSIX, и описан в 2.5.2 Специальные параметры :

?
Расширяется до десятичного состояния выхода самого последнего конвейера (см. Конвейеры ).

Томас Дики
источник
5
Не только оболочка POSIX, все оболочки типа Bourne, в том числе оболочка Bourne (я полагаю, именно она представляла ее, в оболочке Mashey, как $rя полагаю). Так что это практически всех Unix-подобных систем, начиная с Unix V7 в конце 70-х. Большинство других оболочек (csh, tcsh, fish, rc) имеют это $status.
Стефан Шазелас
2
И многие языки сценариев: Perl, Ruby и т. Д.
OrangeDog
13

Как сказал Томас Дики, любая оболочка POSIX (т.е. почти все из них) будет иметься $?.

Этот вопрос меня немного заинтересовал, поэтому я проверил его на любой оболочке, которую смог достать:

  • mksh
  • zsh
  • /bin/sh на моем Samsung Galaxy S5
  • /bin/sh на моем роутере
  • tcsh
  • ksh
  • dash
  • /bin/sh на моей виртуальной UNIX System V с 1989 года или около того
  • cmd.exeи powershell.exeна моем компьютере с Windows 10

и $?работал во всех этих, но fishи cmd.exe.

Нашел две интересные вещи:

1. $?работает в Windows PowerShell!

Ну, в точку. Вместо того, чтобы возвращать 0 или большее число, это просто Trueи 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. $?не работает в оболочке fish.

Тем не менее, когда вы вводите $?рыбу, вы получаете это сообщение:

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

Я не использовал это много, но я не удивлен, у меня, fishкажется, есть свой собственный интересный язык оболочки, полностью отличающийся от bashчего-либо.

абрикосовый мальчик
источник
В большинстве оболочек (fish, csh, tcsh, rc, zsh) используется $statusгораздо более понятная / разборчивая IMO. Только Bourne-подобные оболочки (среди оболочек Unix) используют $?AFAIK.
Стефан Шазелас
3
Все зависит от того, как вы читаете. Я мысленно читаю $?как "ш ## случилось?" и после этого я никогда не забывал значение этой специальной переменной :)
2
@nwildner лол! Я думаю, что никогда не забуду это сейчас!
Hanetzer