É o "$?" variável (ponto de interrogação em dólar) disponível apenas no shell Bash?

10

No Bashshell, eu posso obter o status de saída do comando através 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 também posso usá-lo em outras conchas?

Nan Xiao
fonte
8
Você pode usá-lo em qualquer shell POSIX, que é um dos parâmetros especiais
cuonglm

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 :

?
Expande para o status de saída decimal do pipeline mais recente (consulte Pipelines ).

Thomas Dickey
fonte
5
Não apenas o shell POSIX, todos os shell Bourne, incluindo o Bourne (que eu acredito que foi quem o apresentou, o shell Mashey o possuía como $reu acredito). Então esse é o sh de praticamente todos os sistemas Unix-like desde o Unix V7 no final dos anos 70. A maioria dos outros shells (csh, tcsh, fish, rc) tem como $status.
Stéphane Chazelas
2
E muitas linguagens de script: Perl, Ruby, etc.
OrangeDog 18/01/16
13

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

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

  • mksh
  • zsh
  • /bin/sh no meu Samsung Galaxy S5
  • /bin/sh no meu roteador
  • tcsh
  • ksh
  • dash
  • /bin/sh no meu sistema UNIX virtual V de 1989 ou mais
  • cmd.exee powershell.exeno meu computador com Windows 10

e $?trabalhou em todos estes, mas fishe cmd.exe.

Encontrou duas coisas interessantes:

1. $?funciona no Windows PowerShell!

Bem, até certo ponto. Em vez de retornar 0 ou um número maior, é apenas Truee 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 $?peixe, você recebe esta mensagem:

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

Não usei muito, mas não estou surpreso, fishparece ter sua própria linguagem shell interessante, completamente diferente bashou o que seja.

menino de damasco
fonte
A maioria das conchas (fish, csh, tcsh, rc, zsh) usa $statusmuito mais IMO direto / legível. Somente as conchas tipo Bourne (entre as conchas do Unix) usam o $?AFAIK.
Stéphane Chazelas
3
Depende apenas de como você está lendo. Eu li mentalmente $?como "sh ## aconteceu?" e, depois disso, eu nunca esqueceu o significado dessa variável especial :)
2
@nwildner lol! Eu acho que nunca vou esquecer isso agora!
hanetzer