Что происходит в Bash после вызова exit?

Что происходит в Bash после вызова exit?

Я понимаю, что когда я вызываю exit, это псевдоним для logout. Иногда, просто ради забавы, когда мне нужно выйти из сеанса, я набираю exit && 1. Теперь что происходит после того, exitкак был выполнен . Куда идет 1? Ввод 1 в bash выдает (очевидно) это: 1: command not found. Я не спрашиваю, почему 1 не работает. Я спрашиваю, куда идет 1 после вызова exit? 1 — это просто пример, замените его любой другой командой.

Но при наборе текста exit &&&&&&& 1возникает синтаксическая ошибка. Поэтому необходимо оценить правую руку.

Отказ от ответственности: Это вопрос, который меня интересует. Для этого вопроса нет особой причины, кроме того, что мне любопытно, что происходит.

решение1

Когда вы набираете exit, оболочка немедленно завершит работу, 1не оценивается. Если вы проверите исходный код наВыход, ты можешь видеть:

int
exit_builtin (list)
     WORD_LIST *list;
{
  if (interactive)
    {
      fprintf (stderr, login_shell ? _("logout\n") : "exit\n");
      fflush (stderr);
    }

  return (exit_or_logout (list));
}

Последнее, что exitделает: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*/
}

Синтаксическая ошибка из- exit &&&&&&& 1за ошибки разбора, а не результата оценки выражения. Разбор происходит до запуска любой команды.

решение2

Он никогда не выполняется, потому что оболочка вышла. Вот простой способ проверить:

$ bash
$ touch /tmp/testfile
$ exit && rm /tmp/testfile
exit
$ ls /tmp/testfile 
/tmp/testfile

Обратите внимание, что я сначала запустил вторую оболочку, чтобы мой XTerm не вышел. Тот же результат получается, когда я этого не делаю и проверяю существование файла из другого окна.

cmd1 && cmd2означает запустить cmd1, затем, если успешно (код выхода = 0), запустить cmd2. Итак, сначала оболочка запускает exit. Выход приводит к тому, что оболочка прекращает свое существование, поэтому она никогда не доходит до части «если успешно».

Ваш ответ на синтаксическую ошибку отличается: Синтаксис проверяется, когда строка вводапроанализировано, до того, как какая-либо его часть будет выполнена. По сути, bash вообще не понимает, что вы имеете в виду, поэтому он не может начать его выполнять.

Связанный контент