O que é `$?`? É uma variável?

23

A questão é bastante direta. Eu posso obter o código de saída do comando anterior usando $?. Mas o que exatamente é isso?

Eu não acho que seja uma variável, porque você não pode ter caracteres especiais no nome da variável além de _.

foo?foo=10

resultará no erro: foo?foo=10: command not found

Então, se não é uma variável, o que é? Existem outros assim?

daltonfury42
fonte
6
stackoverflow.com/questions/6834487/... aqui vai :)
RiddleMeThis

Respostas:

23

O que é isso?

$? é uma variável interna que armazena o status de saída de um comando, função ou do próprio script.

$?lê o status de saída do último comando executado. Após o retorno de uma função, $?fornece o status de saída do último comando executado na função. Essa é a maneira de Bash atribuir às funções um "valor de retorno". Retorna 0com sucesso ou um número inteiro no intervalo 1 - 255em erro.

Existem outros também?

Sim, existem várias variáveis ​​internas no bash. Você pode ver uma lista aqui . Consulte: http://www.tldp.org/LDP/abs/html/exit-status.html

Ron
fonte
1
Portanto, está disponível apenas no shell bash?
precisa saber é o seguinte
4
@ daltonfury42 não, qualquer shell que as tentativas para ter alguma compatibilidade com o shell Bourne vai apoiá-lo (incluindo dash, ksh, zsh, entre outros).
muru
2
CSH e utilização de peixe $statuspara o mesmo propósito
Glenn Jackman
22

$?é uma variável, mas especial, é por isso que caracteres especiais são permitidos. ($?)Expande para o status de saída do pipeline de primeiro plano executado mais recentemente.

Não é o único, o shell trata vários parâmetros especialmente. Esses parâmetros podem ser referenciados apenas; a atribuição a eles não é permitida:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

Fontes:

Sylvain Pineau
fonte
2
"$*"não são apenas todos os parâmetros posicionais como uma única palavra, mas todos os parâmetros posicionais separados pelo primeiro caractere de IFScomo uma única palavra. Como o resultado estará sujeito à divisão do campo se não estiver entre aspas, o efeito é como se $@fosse usado no caso entre aspas .
muru 9/07/2015
1
Para ter certeza: $ @ e $ * sem aspas são os mesmos porque ambos estão sujeitos à divisão de palavras. Citado, "$ @" preserva a divisão da palavra dos parâmetros posicionais, mesmo que um parâmetro individual contenha um caractere no IFS.
Kjiro
1
Existe uma referência de quando isso é usado para conchas? Gostaria de saber se o Perl aceitou os scripts de shell.
Simbolismo
Isso antecede o Perl por décadas (ou pelo menos anos). Muita da sintaxe Perl foi influenciada pela sintaxe do shell. (Perl nasceu em 1987, e grande parte dessa sintaxe veio do shell Bourne original (1977). Não sou 100% quando $ _ foi introduzido, mas quase certamente antes de 1987.
Pop
6

$?é um parâmetro especial do shell (variável).

Em geral, todas as variáveis ​​definidas pelo usuário devem ser nomeadas usando apenas os caracteres da classe de caracteres, [:alnum:]ou seja, [a-zA-Z0-9_](também não é possível começar [0-9]).

Em poucas palavras, $?é uma variável especial ( e há algumas delas ) que pode ser considerada como recurso interno do próprio shell que fornece o código de saída do comando anterior (com êxito ou com falha).

Você pode ler isso para ter uma idéia melhor das variáveis.

heemail
fonte
4

$?é uma variável especial no bash que sempre mantém o código de retorno / saída do último comando executado.

Você pode visualizá-lo em um terminal executando echo $?.

Os códigos de retorno estão no intervalo [0; 255]
Um código de retorno 0geralmente significa que está tudo ok.
Outros valores indicam erros. A maioria dos aplicativos retorna 1ou valores personalizados. Se um comando não foi encontrado, a variável geralmente contém127

Se você deseja definir essa variável para um valor específico, é possível fazer isso facilmente bash -c "exit 5"para retornar, por exemplo, o código de retorno 5.

Byte Commander
fonte
Uma função de shell é uma maneira compatível com POSIX para definir o status de saída sem necessariamente bifurcar-se. setstatus() { return 5; }
Kojiro