我知道当我调用exit时,它是注销的别名。有时,只是为了好玩,当我需要从会话中退出时,我会输入exit && 1
.现在exit
执行后会发生什么。去哪儿了1
?在 bash 中输入 1 (显然)会产生这样的结果:1: command not found
。我不是问为什么 1 不起作用。我想问的是,调用 exit 后 1 去了哪里? 1 只是一个示例,请将其替换为任何其他命令。
但输入exit &&&&&&& 1
会产生语法错误。所以必须评估右手。
免责声明: 这是我感兴趣的一个问题。除了我对发生的事情感到好奇之外,这个问题没有什么特别的原因。
答案1
当您键入 时exit
,shell 将立即退出,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
它从未被执行,因为 shell 退出了。这是一个简单的测试方法:
$ bash
$ touch /tmp/testfile
$ exit && rm /tmp/testfile
exit
$ ls /tmp/testfile
/tmp/testfile
请注意,我首先启动了第二个 shell,这样我的 XTerm 就不会退出。当我不这样做并从不同的窗口检查文件是否存在时,会获得相同的结果。
cmd1 && cmd2
表示运行cmd1
然后,如果成功(退出代码= 0),则运行cmd2
。因此,首先 shell 运行exit
。退出会导致 shell 停止存在,因此它永远不会到达“如果成功”部分。
您对语法错误的后续处理有所不同:输入行时检查语法解析的,在执行它的任何部分之前。基本上,bash根本不明白你的意思,所以它无法开始执行它。