為什麼 Linux 中的終端機和 Shell 是兩個獨立的程式?

為什麼 Linux 中的終端機和 Shell 是兩個獨立的程式?

在 Windows 中,使用 CLI 時,僅使用一個程式 ( cmd.exe)。您將輸入傳送到cmd.exe,然後cmd.exe再向您發送輸出(在螢幕上顯示輸出):

在此輸入影像描述

但在 Linux 中,使用了兩個程式:終端機和 Shell。

您將輸入傳送到終端(例如:gnome-terminal),gnome-terminal然後將此輸入傳送到 Shell(例如:bash),然後bash將輸出傳送到gnome-terminalgnome-terminal然後再傳送輸出給您。

在此輸入影像描述

我的問題是:為什麼終端機和 Shell 在 Linux 中是兩個獨立的程序,而不是像 Windows 中那樣是一個程序?

答案1

你的前提是不正確的。 Windows 中「終端」的角色或多或少是由 conhost.exe 扮演的 - 控制台子系統的設計方式並不像 Linux 中的終端那樣可互換(並且還有其他差異,例如,當您啟動控制台模式進程(例如尚未附加到控制台的cmd.exe )時,啟動該進程的系統庫將負責為您建立一個),但它是由單獨進程管理的單獨層。

答案2

我想說 1)因為歷史,2)因為這是個好主意。

通常我們呼叫gnome-terminalxterm終端模擬器。過去,沒有終端模擬器,因為沒有圖形使用者介面。一切都是正確的終端、透過串行電纜連接的帶有螢幕和鍵盤的設備到計算機。 Shell 在當時也很有用,並且被編寫為支援從終端獲取命令。 (可能來自任意文件描述符,但這並不重要。)

對於 Linux 虛擬終端和 GUI 之類的東西,讓它們模擬原始終端是很有用的,這樣舊的軟體就可以正常工作,或者至少可以進行最小的更改。這不僅意味著 shell,還意味著與「終端」互動的其他程式。 (ls???)viemacs

此外,分離也是一個好主意,因為它允許人們獨立地交換終端模擬器和 shell。我可以在 xterm 上使用 Bash,或在 gnome 終端機上使用 zsh,或透過 SSH 連線使用 Bash,或...

如果將各個部分綁在一起,這個選擇就會更加困難。


順便說一句,我也不太確定cmd.exe終端模擬部分本身的實作。我已經有一段時間沒有接觸過 Windows 上的編譯器了,但如果我沒記錯的話,可以在不涉及cmd.exe.看這裡這裡

答案3

gnome-terminalbash將作為預設應用程式 運行,但是xtermgnome-terminal系列旨在運行任意命令,而不僅僅是 shell,您可以運行例如:

xterm -e /bin/bash
xterm -e /usr/local/bin/fish
xterm -e tail -f /var/log/messages
xterm -e man ls

在最後一種情況下,xterm 將顯示 ls 手冊頁,如果我退出,xterm將退出。

對於 /var/log/messages,我可能會使用 xterm 選項來設定字體或更改顏色。

請注意,gnome-terminal也使用-e語法來運行命令。

答案4

我認為,因為在Linux中你可以有多個shell(bash ksh ....)

Windows中只有1個程序,cmd。現在微軟需要 2 個程式來增加更多功能(power shell)

在Linux中只需更改shell即可提高您的要求

相關內容