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

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

Bashshell 中,我可以通过变量获取命令退出状态$?

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

它只能在 Bash shell 中使用吗?或者我也可以在其他 shell 中使用它吗?

答案1

退出代码$?对于任何遵循 POSIX 的 shell 都是通用的,并且在2.5.2 特殊参数:

?
扩展到最近管道的十进制退出状态(请参阅管道)。

答案2

正如 Thomas Dickey 所说,任何 POSIX shell(即几乎所有 shell)都会有$?.

这个问题让我很感兴趣,所以我在任何我能拿到的 shell 上测试了它:

  • 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 或更大的数字,而是返回TrueFalse

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.$?在shell中不起作用fish

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

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

我没怎么用过它,但我并不感到惊讶,fish似乎有它自己有趣的 shell 语言,完全不同于bash或其他什么。

相关内容