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