O manual do bash afirma:
eval [arg ...]
The args are read and concatenated together into a single com-
mand. This command is then read and executed by the shell, and
its exit status is returned as the value of eval. If there are
no args, or only null arguments, eval returns 0.
eu tento
eval `nonsense`
echo $?
O resultado é 0
.
Considerando que quando eu executo o comando entre aspas separadamente:
`nonsense`
echo $?
O resultado é 127
.
Pelo que está escrito no manual do bash, eu esperaria eval
retornar 127
ao usar as citações invertidas nonsense
como argumento.
Como obter o status de saída do argumento de eval
?
Na verdade, é mais o:
Isso é surpreendente aqui.
Estamos pedindo
bash
para executar o comando resultante do operador split+glob no stdout denonsense
. Comononsense
não produz saída, não executa nenhum comando, então você pode pensar que o status de saída deveria ser 0.Mas, na verdade, quando uma linha de comando simples não tem argumento, apenas atribuição ou redirecionamento, o status de saída é o da última substituição de comando em atribuição e palavras normais (não em alvos de redirecionamento) que foi executado (embora a falha nos redirecionamentos também afete o estado de saída).
Isso é especialmente útil com atribuições.
Dentro:
Você pode obter o status de saída e saída de
grep
, o que você não poderia fazer se$?
fosse o status de saída desse não-comando.Dentro:
É onde há palavras de atribuição e palavras de argumento, o status de saída de
cmd1
é ignorado.$?
conterá o status de saída decmd2
.E, também
$output
só será definido paracmd2
apenas. A exceção a isso é quandocmd2
é um builtin especial.eval
é um builtin tão especial .Nos
bash
shells POSIX mais modernos.ou
A saída seria 0, pois é o resultado da execução
eval
sem argumento. Mas esse não era o caso no shell Bourne ou ksh88, onde para builtins especiais você obteria o status de saída deexit 5
lá.Nesses shells, você também encontrará:
Como
set
é outro builtin especial..
é outro builtin especial. No shell Bourne e ksh88:(desde
/some/file
que não execute nenhum comando)Quando você faz o seguinte -
Você basicamente está perguntando "Diga-me o status de saída quando tento obter a saída do comando sem sentido", a resposta é "comando não encontrado" ou 127
Mas quando você faz o seguinte
Você está perguntando "diga-me o status de saída de eval quando avalio uma string vazia" (a saída do comando sem sentido), que é igual a executar
eval
sem argumentos.eval
não tem problemas em rodar sem argumentos e seu status de saída torna-se 0