O que
echo $?
significa em programação shell?
shell
scripting
special-characters
Harshay Buradkar
fonte
fonte
Respostas:
Este é o status de saída do último comando executado.
Por exemplo, o comando
true
sempre retorna um status de0
efalse
sempre retorna um status de1
:Do manual: (acessível chamando
man bash
no seu shell)Por convenção, um status de saída
0
significa sucesso e status de retorno diferente de zero significa falha. Saiba mais sobre os status de saída na wikipedia .Existem outras variáveis especiais como essa, como você pode ver neste manual on-line: https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
fonte
$
e?
são dois parâmetros distintos e$?
não aparece na página de manual do bash (1).$?
retorna o valor de saída do último comando executado.echo $?
imprime esse valor no console. zero implica uma execução bem-sucedida, enquanto valores diferentes de zero são mapeados para vários motivos de falha.Portanto, ao criar scripts; Costumo usar a seguinte sintaxe
A comparação deve ser feita em iguais a
0
ou não0
.** Atualização com base no comentário: idealmente, você não deve usar o bloco de código acima para comparação, consulte os comentários e explicações do @tripleee.
fonte
cmd; if [ $? -eq 0 ]; then
deve ser refatorada paraif cmd; then
. O próprio propósito deif
(e as outras instruções de controle de fluxo no shell) é para executar um comando e examinar seu estado de saída.if cmd;
pode não ser muito legível em algumas condições, especialmente quando cmd se refere a outro script.[ 1 ]
e[ 0 ]
são ambos verdadeiros;[
sem um operador verifica se o argumento é uma sequência não vazia.vendor/bin/drush status bootstrap | grep -q $(vendor/bin/drush php-eval 'if (function_exists("t")) echo t("Successful");') &> /dev/null;
. Se eu tivesse que colocar isso em uma única linhaif [ ... ]
, seria terrivelmente ilegível. Eu pretendo armazenar a saída dessa linha em uma variável, para que eu possa dizerif [ $drupal_installed -eq 0 ]
mais tarde.eco $? - Dá o EXIT STATUS do comando executado mais recentemente . Esse EXIT STATUS provavelmente seria um número com ZERO implicando Success e qualquer valor NÃO-ZERO indicando Failure
? - Este é um parâmetro / variável especial no bash.
$? - Fornece o valor armazenado na variável "?".
Alguns parâmetros especiais semelhantes no BASH são 1,2, *, # (normalmente vistos no comando echo como $ 1, $ 2, $ *, $ #, etc.).
fonte
Possui o último código de status (valor de saída) de um comando.
fonte
Exemplo mínimo de status de saída do POSIX C
Para entender
$?
, você deve primeiro entender o conceito de status de saída do processo definido pelo POSIX . No Linux:quando um processo chama a chamada do
exit
sistema, o kernel armazena o valor passado para a chamada do sistema (anint
) mesmo depois que o processo morre.A chamada de sistema exit é chamada pela
exit()
função ANSI C e, indiretamente, quando você fazreturn
a partirmain
.o processo que chamou o processo filho de saída (Bash), geralmente com
fork
+exec
, pode recuperar o status de saída do filho com await
chamada do sistemaConsidere o código Bash:
OC "equivalente" é:
false.c
bash.c
Compile e execute:
Resultado:
No Bash, quando você pressiona enter, um fork + exec + wait acontece como acima, e o bash define
$?
o status de saída do processo bifurcado.Nota: para comandos internos
echo
, como , um processo não precisa ser gerado, e o Bash apenas define$?
como 0 para simular um processo externo.Normas e documentação
POSIX 7 2.5.2 "Parâmetros especiais" http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02 :
man bash
"Parâmetros especiais":O ANSI C e o POSIX recomendam que:
0
significa que o programa foi bem sucedidooutros valores: o programa falhou de alguma forma.
O valor exato pode indicar o tipo de falha.
O ANSI C não define o significado de quaisquer valores e o POSIX especifica valores maiores que 125: Qual é o significado de "POSIX"?
O Bash usa o status de saída para
if
No Bash, geralmente usamos o status de saída
$?
implicitamente para controlarif
instruções como em:Onde
true
é um programa que apenas retorna 0.O acima é equivalente a:
E em:
[
é apenas um programa com um nome estranho (e o Bash incorporado que se comporta como ele) e1 = 1 ]
seus argumentos, veja também: Diferença entre colchetes simples e duplos no Bashfonte
Em http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
fonte
Consulte o Manual do Bash em 3.4.2 Parâmetros especiais :
É um pouco difícil de encontrar porque não está listado como
$?
(o nome da variável é "apenas"?
). Veja também a seção de status de saída , é claro ;-)Feliz codificação.
fonte
Mostra o resultado do último comando unix executado
fonte