Entendo que quando chamo exit, é um alias para logout. Às vezes, apenas por diversão, quando preciso sair de uma sessão, digito exit && 1
. Agora o que acontece depois que o arquivo exit
foi executado. Para onde vai 1
? Digitar 1 no bash produz (obviamente) isto: 1: command not found
. Não estou perguntando por que 1 não funciona. Estou perguntando para onde vai o 1 depois de chamar exit? 1 é apenas um exemplo, substitua-o por qualquer outro comando.
Mas a digitação exit &&&&&&& 1
gera um erro de sintaxe. Portanto, a mão direita deve ser avaliada.
Isenção de responsabilidade: Esta é uma questão que me interessa. Não há nenhuma razão específica para esta pergunta além do fato de que estou curioso para saber o que acontece.
Responder1
Quando você digita exit
, o shell será encerrado imediatamente e 1
não será avaliado. Se você verificar o código-fonte parasaída, você pode ver:
int
exit_builtin (list)
WORD_LIST *list;
{
if (interactive)
{
fprintf (stderr, login_shell ? _("logout\n") : "exit\n");
fflush (stderr);
}
return (exit_or_logout (list));
}
A última coisa exit
faz:return (exit_or_logout (list))
static int
exit_or_logout (list)
WORD_LIST *list;
{
int exit_value;
..............
/* Get return value if present. This means that you can type
`logout 5' to a shell, and it returns 5. */
/* If we're running the exit trap (running_trap == 1, since running_trap
gets set to SIG+1), and we don't have a argument given to `exit'
(list == 0), use the exit status we saved before running the trap
commands (trap_saved_exit_value). */
exit_value = (running_trap == 1 && list == 0) ? trap_saved_exit_value : get_exitstat (list);
bash_logout ();
last_command_exit_value = exit_value;
/* Exit the program. */
jump_to_top_level (EXITPROG);
/*NOTREACHED*/
}
O erro de sintaxe é exit &&&&&&& 1
devido a um erro de análise, não ao resultado da avaliação da expressão. A análise ocorre antes da execução de qualquer comando.
Responder2
Nunca é executado porque o shell foi encerrado. Aqui está uma maneira fácil de testar:
$ bash
$ touch /tmp/testfile
$ exit && rm /tmp/testfile
exit
$ ls /tmp/testfile
/tmp/testfile
Observe que primeiro iniciei um segundo shell para que meu XTerm não fosse encerrado. O mesmo resultado é obtido quando não faço isso e verifico a existência do arquivo em uma janela diferente.
cmd1 && cmd2
significa executar cmd1
então, se for bem-sucedido (código de saída = 0), execute cmd2
. Então, primeiro o shell é executado exit
. Sair faz com que o shell deixe de existir, então ele nunca chega à parte "se for bem-sucedido".
Seu acompanhamento com o erro de sintaxe é diferente: a sintaxe é verificada quando a linha de entrada éanalisado, antes que qualquer parte dele seja executada. Basicamente, o bash não entende o que você quer dizer, então não pode começar a executá-lo.