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).
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?
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).
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:
$?
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
$?
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.
Tags bash shell portability