调用 exit 后 Bash 会发生什么?

Rya*_*yan 6 bash

我知道当我调用 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由于解析错误而导致的语法错误,而不是计算表达式的结果。解析发生在任何命令运行之前。

  • @mikeserv 你很困惑。`exit` 的参数确实被评估了,但是在它之后 * 出现的任何(单独的)命令都不是。`exit 5` 是一个单一的命令;`exit 5 && exit 10` 是两个,第二个永远不会被执行。 (2认同)

der*_*ert 5

它从未执行过,因为 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 根本不明白你的意思,所以它不能开始执行它。

  • 只是为了一些乐趣:`function exit() { echo "你的上帝现在在哪里?"; }; 退出&& echo eeek` (5认同)