O que acontece no Bash depois de chamar a saída?

6

Eu entendo que quando eu chamo exit, é um alias para o logout. Às vezes, apenas por diversão, quando preciso me retirar de uma sessão, digito exit && 1 . Agora o que acontece depois que o exit foi executado. Onde o 1 vai? Digitando 1 no bash produz (obviamente) isto: 1: command not found . Não estou perguntando por que 1 não funciona. Eu estou perguntando para onde o 1 vai depois de chamar a saída? 1 é apenas um exemplo, substitua-o por qualquer outro comando.

Mas digitar exit &&&&&&& 1 produz um erro de sintaxe. Então a mão direita deve ser avaliada.

Aviso de isenção : esta é uma questão em que me interessa. Não há uma razão específica para essa questão, além do fato de que estou curioso sobre o que acontece.

    
por Ryan M 19.06.2014 / 22:09

2 respostas

10

Quando você digita exit , o shell será encerrado imediatamente, 1 não é avaliado. Se você verificar o código-fonte para sair , você poderá 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 que 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 em exit &&&&&&& 1 devido ao erro de análise, não o resultado da avaliação da expressão. A análise ocorre antes de qualquer execução de comando.

    
por 19.06.2014 / 22:30
5

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

Note que eu iniciei um segundo shell para que meu XTerm não saísse. O mesmo resultado é obtido quando não o faço e verifiquei a existência do arquivo a partir de uma janela diferente.

cmd1 && cmd2 significa executar cmd1 , se for bem-sucedido (código de saída = 0), execute cmd2 . Então, primeiro o shell executa exit . A saída faz com que o shell pare de existir, portanto nunca chega à parte "se for bem-sucedido".

Seu acompanhamento com o erro de sintaxe é diferente: A sintaxe é verificada quando a linha de entrada é analisada , antes que qualquer parte dela seja executada. Basicamente, bash não entende o que você quer dizer, então não pode começar a executá-lo.

    
por 19.06.2014 / 22:22

Tags