Administração de Linux Question #019e3987
Quando o comando echo $? retorna 1, qual das seguintes afirmações é verdadeira?
É o ID do processo do comando echo.
É o ID do processo do shell atual.
É o valor de saída do comando executado imediatamente antes do echo.
É o valor de saída do comando echo.
Official Explanation / Community Explanations
O comando echo $? exibe o código de saída do último comando executado. Neste caso, echo $? retorna 1, o que indica que o comando executado imediatamente antes de echo terminou com um status diferente de zero (normalmente indicando um erro). A variável $? é uma variável especial do shell que armazena o código de saída do pipeline em primeiro plano executado mais recentemente.
Como funciona
- Em Unix/Linux, cada comando retorna um código de saída (inteiro) para o shell ao ser concluído. Por convenção,
0significa sucesso, e qualquer valor diferente de zero (1-255) indica um erro ou término anormal. - O shell armazena esse código de saída na variável
$?imediatamente após a conclusão do comando. - Executar
echo $?imprime o valor de$?, que é o código de saída do comando anterior.
Por que o valor correto está certo
A afirmação "É o valor de saída do comando executado imediatamente antes do echo" está correta porque $? sempre reflete o status de saída do último comando executado. Se o comando anterior falhou (por exemplo, ls /inexistente), $? seria diferente de zero, como 1.
Por que os valores incorretos estão errados
- "É o ID do processo do comando echo": O ID do processo (PID) de um comando é obtido através de
$$(PID do shell atual) ou$!(PID do último processo em segundo plano), não$?.$?contém o status de saída, não o PID. - "É o ID do processo do shell atual": O PID do shell atual é armazenado em
$$, não$?.$?não tem relação com IDs de processo. - "É o valor de saída do comando echo": O comando
echoem si quase sempre é bem-sucedido (código de saída 0), a menos que ocorra um erro de gravação. A saída1vem do comando que foi executado antes deecho, não do próprioecho. Depois queechoé executado,$?seria0(supondo sucesso), então o valor1deve ser de um comando anterior.