Я понимаю, что когда я вызываю 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 вообще не понимает, что вы имеете в виду, поэтому он не может начать его выполнять.