我知道当我调用 exit 时,它是注销的别名。有时,只是为了好玩,当我需要从会话中删除自己时,我会输入exit && 1
. 现在exit
执行后会发生什么。在什么地方1
去?在 bash 中输入 1 会产生(显然)这个:1: command not found
. 我不是问为什么 1 不起作用。我问的是 1 调用 exit 后去哪里了?1 只是一个例子,用任何其他命令替换它。
但是打字会exit &&&&&&& 1
产生语法错误。所以必须评估右手。
免责声明:这是一个我感兴趣的问题。除了我对发生的事情感到好奇之外,这个问题没有特别的原因。
cuo*_*glm 10
当您键入时exit
,shell 将立即退出,1
不进行评估。如果检查exit的源代码,您可以看到:
int
exit_builtin (list)
WORD_LIST *list;
{
if (interactive)
{
fprintf (stderr, login_shell ? _("logout\n") : "exit\n");
fflush (stderr);
}
return (exit_or_logout (list));
}
Run Code Online (Sandbox Code Playgroud)
最后一件事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*/
}
Run Code Online (Sandbox Code Playgroud)
exit &&&&&&& 1
由于解析错误而导致的语法错误,而不是计算表达式的结果。解析发生在任何命令运行之前。
它从未执行过,因为 shell 退出了。这是一个简单的测试方法:
$ bash
$ touch /tmp/testfile
$ exit && rm /tmp/testfile
exit
$ ls /tmp/testfile
/tmp/testfile
Run Code Online (Sandbox Code Playgroud)
请注意,我首先启动了第二个 shell,这样我的 XTerm 就不会退出。当我不这样做并从不同的窗口检查文件是否存在时,会获得相同的结果。
cmd1 && cmd2
表示运行cmd1
,如果成功(退出代码 = 0),则运行cmd2
。所以,首先 shell 运行exit
. 退出会导致 shell 停止存在,因此它永远不会进入“如果成功”部分。
您对语法错误的后续处理是不同的:在解析输入行时,在执行它的任何部分之前检查语法。基本上,bash 根本不明白你的意思,所以它不能开始执行它。