O que acontece no Bash depois de chamar exit?

O que acontece no Bash depois de chamar exit?

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 exitfoi 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 &&&&&&& 1gera 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 1nã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 exitfaz: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 &&&&&&& 1devido 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 && cmd2significa executar cmd1entã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.

informação relacionada