是“ $?” (美元问号)变量仅在Bash shell中可用?


10

Bash外壳中,我可以通过$?变量获取命令退出状态:

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

它仅在Bash shell中可用吗?还是可以在其他外壳中使用它?


8
您可以在任何POSIX shell中使用它,它是特殊参数之一
cuonglm

Answers:


19

$?退出代码是共同的后面POSIX任何壳,和在被描述2.5.2特殊参数

?
扩展到最新管道的小数退出状态(请参见Pipelines)。


5
不仅是POSIX外壳,包括Bourne外壳在内的所有类似Bourne的外壳(我相信是介绍它的外壳,Mashey外壳也有$r我相信的外壳)。自从70年代末Unix V7以来,这几乎是所有类似Unix的系统的嘘声,大多数其他外壳(csh,tcsh,fish,rc)都将其作为$status
斯特凡Chazelas

2
以及许多脚本语言:Perl,Ruby等
。– OrangeDog

13

正如托马斯·迪基(Thomas Dickey)所说,任何POSIX外壳(即几乎所有外壳)都将具有$?

这个问题使我很感兴趣,因此我在可以接触到的任何外壳上进行了测试:

  • mksh
  • zsh
  • /bin/sh 在我的三星Galaxy S5上
  • /bin/sh 在我的路由器上
  • tcsh
  • ksh
  • dash
  • /bin/sh 在1989年左右的虚拟UNIX System V上
  • cmd.exepowershell.exe我的Windows 10计算机上

并且$?在所有这些方面都做过,但是fishcmd.exe

发现了两个有趣的事情:

1. $?可在Windows PowerShell中使用!

好吧,在某种程度上。而不是返回0或更高的数字,而只是Trueand 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

但是,当您键入$?fish时,您会收到以下消息:

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

我并没有使用太多,但是我并不感到惊讶,fish似乎有它自己有趣的shell语言,完全不同于bash其他语言。


大多数外壳(鱼,csh,tcsh,rc,zsh)都使用$status更简单明了的IMO。仅类Bourne外壳(在Unix外壳中)使用$?AFAIK。
斯特凡Chazelas

3
取决于您的阅读方式。我心里读着$?“ sh ##发生了?” 在那之后,我再也没有忘记这个特殊变量的含义:)

2
@nwildner哈哈!我想我永远不会忘记这一点!
hanetzer '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.