A variável “$?” (dollar-question mark) está disponível apenas no shell Bash?

10

No shell Bash , posso obter o status de saída do comando por meio da variável $? :

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

Está disponível apenas no shell Bash? Ou eu também posso usá-lo em outros shells?

    
por Nan Xiao 18.01.2016 / 03:05

2 respostas

19

O código de saída $? é comum a qualquer shell que segue o POSIX e é descrito em 2.5.2 Parâmetros Especiais :

?
Expands to the decimal exit status of the most recent pipeline (see Pipelines).

    
por 18.01.2016 / 03:08
13

Como Thomas Dickey disse, qualquer shell POSIX (ou seja, praticamente todos eles) terá $? .

Esta pergunta me interessou bastante, então eu testei em qualquer shell que eu pudesse colocar em minhas mãos:

  • mksh
  • zsh
  • /bin/sh no meu Samsung Galaxy S5
  • /bin/sh no meu roteador
  • tcsh
  • ksh
  • dash
  • /bin/sh no meu Virtual UNIX System V de 1989 ou mais
  • cmd.exe e powershell.exe no meu computador Windows 10

e $? funcionaram em todos eles, mas fish e cmd.exe .

Encontrei duas coisas interessantes:

1. $? funciona no Windows PowerShell!

Bem, até certo ponto. Em vez de retornar 0 ou um número maior, é apenas True e 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. $? não funciona no shell fish .

No entanto, quando você digita $? em fish, recebe esta mensagem:

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

Eu não usei muito, mas não estou surpreso, fish parece ter sua própria linguagem de shell interessante, completamente diferente de bash ou qualquer outra coisa.

    
por 18.01.2016 / 09:49