呼叫 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根本不明白你的意思,所以它無法開始執行它。

相關內容