本文介紹了GNU項目與Linux系統的關係,GNU項目提供了許多自由軟體,其中一些成為了Linux系統的核心組件。文章還討論了Shell的概念以及在Linux中的應用,以及X Window System和GNOME桌面環境在提供圖形界面方面的作用。 ...
Linux Bash Shell 腳本入門(2)——GNU
目錄可點擊內容,大部分來自維基百科,可以點擊瞭解詳情。
GNU與Linux
GNU
GNU操作系統起源於GNU計劃,由理查德·斯托曼在麻省理工學院人工智慧實驗室發起,希望發展出一套完整的開放源代碼操作系統來取代Unix,計劃中的操作系統,名為GNU。
GNU的商標是一個牛羚頭。原先版本是Etienne Suvasa所設計,而今比較流行的粗體版本則是Aurelio Heckert所設計。
GNU是一個自由的操作系統,其內容軟體完全以GPL方式發佈(什麼是GPL下文會介紹)。這套操作系統是GNU計劃的主要目標,名稱來自GNU's Not Unix!的遞歸縮寫,因為GNU的設計類似Unix,但它不包含具著作權的Unix代碼。
讀到這裡你可能會難以理解,我從來沒聽說過GNU操作系統,像是Linux,Unix這種都是很有名的,但GNU到底是什麼?
1983年9月27日,理查德·斯托曼在 net.unix-wizards 和 net.usoft新聞組中公佈這項GNU計劃。斯托曼的目標是成立一個完全自由的操作系統,他希望電腦用戶是能夠“自由使用”的。
為什麼要在這裡強調自由使用呢?因為在20世紀60年代和70年代 - 大多數人都能自由學習軟體的源代碼,自由地與他人分享的軟體,可自由修改軟體,自由發佈軟體修改後的版本。也就是說早些年軟體幾乎不存在著作權,每個人都可以自由地使用和修改。
1984年1月5日,理查德正式開始開發軟體,為了防止這些軟體將來可能被主張所有權,影響到Free Software的發展,斯托曼辭去了在實驗室的工作。
理查德·斯托曼使用不相容分時系統(英語:Incompatible Timesharing System) (ITS)[6](一種早期的操作系統,使用彙編語言撰寫,因其所運行的被稱為 PDP-10的電腦系統架構停止發展而變得過時)的經驗,決定了需要設計一種可移植系統。由此,會議決定,將開發新的系統,並使用 C 和Lisp作為系統編程語言。[8] GNU將與UNIX相容。[9] 當時,UNIX已經是一個流行的專有操作系統。而Unix的設計是模塊化的,所以它可以被逐步分塊的實現。
Unix在學術機構和大型企業中得到了廣泛的應用,當時的UNIX擁有者AT&T公司以低廉甚至免費的許可將Unix源碼授權給學術機構做研究或教學之用,許多機構在此源碼基礎上加以擴展和改進,形成了所謂的“Unix變種”,這些變種反過來也促進了Unix的發展。
後來AT&T意識到了Unix的商業價值,不再將Unix源碼授權給學術機構,並對之前的Unix及其變種聲明瞭著作權權利。BSD在Unix的歷史發展中具有相當大的影響力,被很多商業廠家採用,成為很多商用Unix的基礎。其不斷增大的影響力終於引起了AT&T的關註,於是開始了一場持久的著作權官司,至此人們意識到我們需要一個完全免費的操作系統。
1984年,開始發展編輯器Emacs等軟體。1985年,發表GNU宣言。1989年,發表GNU通用公共許可協議。這個公共開源許可協議,你如果開源過項目一定見過,它叫GPL協議,GPL是自由軟體和開源軟體的最流行許可證[18]。到2004年4月,GPL已占Freshmeat(英語:Freshmeat)上所列的自由軟體的約75%,SourceForge的約68%。類似的,2001年一項關於Red Hat Linux 7.1的調查顯示一般的代碼都以GPL發佈。著名的GPL自由軟體包括Emacs,Linux核心(並非所有Linux發行版的核心都是開源的)和GCC。
我們回到GNU的操作系統來,因為許多必要的軟體需要從零開始寫起來,但是有很多已經存在的第三方組件如 TeX、X Window System[4]和Mach微內核等等都可以進行利用,其中GNU最關鍵系統內核,是在GNU Mach微內核基礎上進行開發,理查德·馬修·斯托曼認為可以藉此加速操作系統的開發,但因為一直不確定卡內基梅隆大學何時要將核心源代碼發佈,造成計劃延宕三年。他在之後承認這是個錯誤。
下圖是大佬的照片:
除了上述的第三方組件外,大多數的GNU軟體是由許多志願者,在他們的空閑時間,或由公司、教育機構和非營利性組織贊助下撰寫。
到 1990 年代初期,操作系統中所需的許多程式(例如庫、編譯器、文本編輯器、命令行 shell和視窗系統)已完成,儘管一些底層元素如稱為GNU Hurd的設備驅動程式、守護進程和內核都停滯不前且不完整。
1991年,Linux出現。1993年,FreeBSD發佈。FreeBSD就是當年與Unix著作權持有公司達成協議重寫的免費版Unix,所有GNU計劃中,運行於用戶空間的軟體,都可以在Linux或FreeBSD上使用。許多開發者轉向於Linux或FreeBSD。其中,Linux成為常見的GNU計劃軟體運行平臺。理查德·斯托曼主張,Linux操作系統使用了許多GNU計劃軟體,應正名為GNU/Linux,但沒有得到Linux社群的一致認同,形成GNU/Linux命名爭議。
林納斯·托瓦茲(Linus)開始在MINIX上開發Linux內核,為MINIX寫的軟體也可以在Linux內核上使用。1991年Linus[16]後來使用GNU軟體代替MINIX的軟體,因為使用從GNU系統來的源代碼可以自由使用,這對Linux的發展有益。同時在GPL的規定下,使用GNU GPL協議的源代碼可以被其他項目所使用,只要這些項目使用同樣的協議發佈源碼。
對於GNU來說沒有構成自己的操作系統是失敗的,但是這個失敗確實促進了行業進步與發展,林納斯·托瓦茲曾說過如果GNU內核在1991年時可以用,他不會自己去寫一個。實際上現在GNU代指的是當年發展下來的一系列軟體。
GNU的組成
該系統的基本組成包括
- GNU編譯器套裝(GCC)
- GNU的C庫(glibc)
- GNU核心工具組(coreutils)
- GNU調試器(GDB)
- GNU編程語言工具程式(binutils)
- GNU Bash shell[10]
- GNOME桌面環境
GNU開發人員已經轉向GNU應用程式和工具的Linux 移植 ,現在也廣泛應用在其它操作系統中使用,上文我們提到的MinGW實際上叫Minimalist GNU for Windows,也就是向Windows移植的GNU最小套件,是將GCC編譯器和GNU Binutils移植到Win32平臺下的產物,包括一系列頭文件(Win32API)、庫和可執行文件。另有可用於產生32位及64位Windows可執行文件的MinGW-w64項目,是從原本MinGW產生的分支。
參考:wiki
Shell
shell是種特殊的交互工具,為用戶提供了啟動程式,管理文件系統中的文件及運行在Linux系統中的進程的途徑。shell的核心就是命令行提示符,負責shell的交互部分,允許用戶輸入文本命令,然後解釋命令併在內核中執行。
常見的命令被用來複制、移動、重命名文件等,你用滑鼠實現的操作,在shell中都可以實現,除此之外,shell也允許在命令行提示符中輸入程式的名稱,他會將程式名稱傳遞給內核以啟動程式。
同時也允許,將多個shell命令放入文件中作為程式執行。這些文件成為shell腳本。凡是能在命令行中執行的命令都可以放入shell腳本中作為一組命令執行。
linux中所有發行版的預設幾乎都是bash shell,bash shell 是GNU Bash shell[10] ,目的是為了替代老版本Unix系統中的Unix shell,Bash shell名字的由來非常有意思,其名字來源於一個諧音梗 Bourne Again Shell (念作 born again)的縮寫,Linux 中當然不僅僅包括GNU的 Bash Shell 也包含其他的shell比如:
- ash:輕量級別的shell,適合運行在記憶體受限的環境中,比如嵌入式等。
- korn:一種與Born Shell相容的shell,但支持一些高級特性,浮點運算等。
- tcsh:一種包含了一些C語言特性引入到shell腳本的shell。
- zsh:一種結合了bash、korn、tcsh的特性的shell。
關於shell的內容會在以後的內容中詳細介紹,這裡就不再贅述。
GNOME桌面環境
隨著Linux系統的發展,最初的操作系統文本界面到圖形化的發展,操作系統不僅僅服務於電腦開發人員,逐漸走向大眾化,用戶不再滿足於陳舊的文本命令行交互,圖形化的操作界面的日漸強烈,當然完成工作的方式不只有一種,Linux一直以來都以此為聞名。圖形化桌面更是如此。Linux有多種圖形化桌面可供選擇。接下來會介紹一種屬於GNU項目的桌面環境。
X Window 軟體
有兩個基本要素決定了你的視頻環境,顯卡和顯示器,顯卡如何讓顯示器顯示就需要軟體來實現,LInux中扶著一部分的就是X Window,X Window是圖形現實的核心部分,控制Linux應用如何在顯示器上呈現漂亮的視窗和圖形。X Window System,通常簡稱為X11或X,是一個基於點陣圖的顯示系統,用於在點陣圖顯示器上提供圖形用戶界面(GUI)。
X Window System的關鍵特性包括:
- 網路透明性:X Window系統設計之初就考慮到了網路支持,允許應用程式的圖形界面可以在網路上的任何地方顯示,實現了客戶端與伺服器之間的通信。這意味著,一個運行在網路中某台電腦上的應用程式可以將其圖形界面顯示在連接到同一網路的另一臺電腦上。
- 客戶端-伺服器架構:在X Window系統中,"伺服器"是運行在用戶機器上的程式,它管理屏幕、鍵盤、滑鼠等輸入輸出設備。"客戶端"是指任何請求伺服器服務的程式,比如圖形應用程式。這裡的“伺服器”和“客戶端”的概念與常規意義上的網路服務和使用者相反。
- 設備和網路獨立性:X Window系統與具體的硬體設備和網路協議無關,可以在各種不同的硬體和網路環境中運行。
- 靈活性和擴展性:X Window提供了基本的框架和協議,開發者可以在其之上構建各種視窗管理器和桌面環境,如GNOME、KDE等,這使得用戶界面可以高度定製化。
儘管X Window本身不是驅動程式,但它依賴於底層的硬體驅動程式來進行圖形渲染和設備輸入輸出操作。例如,X伺服器需要與顯卡的驅動程式交互,以控制屏幕上的圖形顯示。因此,為了使X Window系統正常工作,相應的硬體設備(如顯卡、鍵盤、滑鼠等)需要有正確安裝的驅動程式。
Linux中能夠實現 X window的軟體不止有一種,Linux中最常見用的有:
- wayland
- X.org
X.org基於最初的Unix X Windos System版本11 ,後來大家把他簡稱為X11,屬於常用的兩種的比較老的版本,新版的linux正在向wayland遷移,雖然這樣說,但是目前Ubuntu22.04預設的還是X11:
在首次安裝Ubuntu的時X11會檢測顯卡和顯示器,然後創建一個含有必要信息的X Window配置文件。在安裝過程中,安裝程式會檢測一次顯示器,以確定所支持的視頻模式。有時這會造成顯示器黑屏幾秒。由於顯卡和顯示器的種類繁多,因此這個過程可能需要花費一點時間。
核心的X Window 軟體能夠生常圖形化現實環境,但僅此而已。儘管這已足以運行單獨的應用程式,但在日常的電腦使用中並不是特別有用,因為畢竟沒有提供桌面環境,用戶無法知道該如何啟動程式,操作文件,為此需要在此基礎上建立一個桌面環境。
註意一下,下圖驅動部分是Nouveau 驅動,是X11的下層驅動:
至於想搞明白每一個環節的具體工作可以參考:
GNOME
Gnome桌面工作在Xorg-Server的上層,提供給用戶相應的桌面環境,其全稱是(GNU Network object model enviroment,GNU網路對象模型環境)是另一個流行的Linux桌面環境,GNOME於1990年首次發佈,現已成為許多Linux發行版預設的桌面環境。
隨著發展GNOME已經度過了很多個版本,可以通過以下命令來查看當前的GNOME版本:
neo@NeoNeuxs:~/Desktop$ gnome-shell --version
GNOME Shell 42.9
GNOME桌面環境又被稱為GNOME-Shell,為什麼會有shell這個單詞呢?
"Shell"(殼)在這裡的含義與其在電腦科學中的一般含義相似,指的是一個提供用戶界面的軟體層,用戶可以通過這個界面與系統的更深層次的功能進行交互,在操作系統中,"shell"通常指的是提供與用戶交互的界面,這可以是命令行界面(CLI)或圖形用戶界面(GUI)。GNOME Shell 是後者的一個例子,它提供了一個圖形界面供用戶啟動程式、管理視窗、切換任務等。
一個新版的Gnome-shell如下: