调用 exit 后 Bash 中会发生什么?

调用 exit 后 Bash 中会发生什么?

我知道当我调用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根本不明白你的意思,所以它无法开始执行它。

相关内容