Qual é o significado de $? em um script de shell?

Respostas:

26

A resposta de Cjm está correta, mas $?pode ser usada de maneiras tolas em scripts de shell, e eu gostaria de alertar contra isso. Muitos scripts shell ruins têm um padrão repetido de código:

run_some_command
EXIT_STATUS=$?

if [ "$EXIT_STATUS" -eq "0" ]
then
    # Do work when command exists on success
else
    # Do work for when command has a failure exit
fi

Se possível (preocupações de legibilidade às vezes se intrometem), você deve codificar essa situação de maneira diferente:

if run_some_command
then
    # Do work when command exists on success
else
    # Do failure exit work
fi

Este último uso é mais rápido, não contamina o espaço de nomes de variáveis ​​do shell com o que equivale a variáveis ​​temporárias, geralmente pode ser muito mais legível para seres humanos e incentiva o uso de "lógica positiva", a prática de escrever condicionais sem negações, o que tem efeitos cognitivos. simplicidade na maioria das situações. Ele acaba com o uso de $?na maior parte.

Bruce Ediger
fonte
5
Sintaxe mais complicada é necessária quando há mais possibilidades do que apenas 0 ou 1 - os programas geralmente comunicam informações úteis por meio de códigos de saída. E também é útil se você precisar reutilizar esse valor posteriormente no código (para registro, por exemplo).
mattdm
3

Além do que cjm disse , se o valor $?for 0, o processo anterior foi encerrado normalmente (ou com êxito). Caso contrário, houve algum erro.

Barun
fonte
8
Nem sempre sinaliza um erro. diffsai com 0 se os arquivos comparados forem iguais, com 1 se forem diferentes e 2 for um erro.
Shawn J. Goff
2
Isso nunca indica um erro. É apenas o status de saída do comando anterior. A coisa "0 se a saída normal" é uma convenção (EXIT_SUCCESS / EXIT_FAILURE)
aviraldg
3

$?-O status de saída do último comando executado.

$0-O nome do arquivo do script atual.

$#-O número de argumentos fornecidos para um script.

$$-O número do processo do shell atual. Para scripts de shell, esse é o ID do processo sob o qual eles estão executando.

Midhun S Sivan
fonte
0

$? nos forneça o status de execução do último comando execute no prompt. O valor '0' indica que o comando foi executado com êxito e '1' é para não ter sucesso.

Rahul Arora
fonte
2
Não apenas nos prompts interativos, mas também nos scripts, e qualquer valor diferente de zero significa falha.
Kusalananda
-3

$?determina o status de saída do comando executado. $seguido por números (por exemplo $1, $2etc.) representa os parâmetros no script de shell.

harika
fonte
Você pode querer ler a resposta correta ...
jasonwryan