Как сказал Томас Дики, любая оболочка 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чего-либо.