## 第?13?章?基礎知識
**目錄**
[](ch13.html#id3059398)
[Shell](ch13s02.html)
[命令](ch13s03.html)
[Linux 程序、進程](ch13s04.html)
[路徑](ch13s05.html)
[軟件](ch13s06.html)
[配置方式](ch13s07.html)
[隱藏文件](ch13s08.html)
[文件類型](ch13s09.html)
[權限](ch13s10.html)
[執行命令的權限](ch13s10.html#rightofcom)
[用戶](ch13s11.html)
[執行命令的身份](ch13s11.html#id3060851)
[群組](ch13s11.html#id3060979)
## Shell
可能您早已能夠熟練的使用 GUI(圖形用戶界面),例如您可以使用鼠標雙擊一個圖標,來打開或者執行它。
我們來看這個過程: 您使用鼠標定位桌面上的一個程序圖標,按下左鍵兩次。系統讀取鼠標指針的位置,并且判斷該位置下圖標的涵義,根據預設的雙擊動作,運行程序或者打開文件。
這一套 GUI 系統,便是一種 Shell,它的作用是實現人機交互。如果我們不能夠控制電腦,那么電腦還不如電視機好玩,不是么?電視機也可以選擇頻道(電視機的遙控器,也是一種人機交互的界面,不過相對于電腦,確實是相當簡單了)
易于上手、界面直觀是 GUI 的優點,但是 GUI 并不意味著簡單!或許您有類似經歷: 桌面上有幾十個程序的啟動圖標,也知道它們的名字,但是翻出一個來,并不是一件輕松的事情。
我的 Windows 系統中,桌面上擺滿了各種圖標,每當啟動一個程序的時候,我都很是困擾。后來嘗試了 音速啟動 這類程序啟動管理器,效果卻不遂人意。[[18](ch13s02.html#ftn.id3059423)]
在 Linux 下,所有的程序都可以通過命令運行。雖然 Linux 也有 GUI,但是它并不比 Windows 的 GUI 更優秀!上面只是簡單的介紹了 CLI(命令行界面)相對 GUI 的優越之處,使用 CLI 還有更多的好處,您會慢慢體會到的。
當然了,在您的印象中,CLI 一定非常的不友善,缺少親和力,冷漠而拒人于千里之外……您和 CLI 之間甚至有代溝的存在
* * *
> [[18](ch13s02.html#id3059423)] 在我的不懈努力下,這個難道最終得到了解決: 將快捷方式名稱簡化,放到特定目錄下,使用 Win+R 組合鍵呼出 運行 對話框,鍵入快捷方式的名稱來運行該程序。比如 反恐精英 的快捷方式為 cs ,我把它放在 Windows 目錄下; 運行 cs 命令,就可以去維護世界和平了。
> 這么多快捷方式,統統放到 Windows 目錄下,非常混亂。因此,我在 D盤 建立了一個名為 path 的目錄,并把它的路徑加入到環境變量的 path 項中,快捷方式放在 D:\path 目錄中。即便重裝系統,只要在環境變量中重新加入此路徑,原來的程序大多可以直接以命令來運行……我的許多朋友強烈要求我幫他們設定這種啟動方式,因為這確實很方便:)
## 命令
坦白的說,冷不丁見到那么老長的一串命令,誰都會毛骨悚然。
也許您使用過 DOS,留下這種印象:命令先放一邊,光是正確的輸入目錄、文件名都夠瞧的。而且 DOS 不區分大小寫,要是像 Linux 一樣區分大小寫,那多恐怖啊!!!
其實 Linux 命令行具有補全功能,非常實用。假設有這樣一個命令:
```
command path/file
```
如果只有一個以 `c` 起始的命令,鍵入 `c` ,再按一次 `tab` 鍵,系統將自動補全該命令余下的部分。 只要 `c` `tab` 兩次按鍵,就可以完成 **command** 的輸入。
現在我們來了解命令的語法結構,這一部分相當重要,您可得看仔細。
我們知道,任何語言都有特定的語法結構,以我們的中文為例:
```
我們鄭重地推薦您Linux!
```
這個句子的語法盡管簡單,卻是大部分的命令行采用的句型。讓我們看一下,這個句子里都有些什么:
> [](ch13s03.html#base11) 主語,Linux 命令的執行者當然是用戶,所以主語一概省略。
> [](ch13s03.html#base13) 一個動詞,作為謂語而存在。Linux 命令中,這一部分是必須的。這一部分也是不同命令之間最根本的區別方式,所以它通常作為命令名,寫在最前面。鍵入 date 命令,您可以查看當前的時間日期。
> [](ch13s03.html#base12) 狀語,用來修飾謂語。與之相對應,Linux 命令可以使用選項來精細調節程序的行為。為了與命令的操作對象相區別,選項前通常要加 - 或者 -- 符號。原則上,在命令名之后,選項的位置可以隨意,但是為了養成一個良好的習慣,我們建議您在命令名后直接跟選項。
> [](ch13s03.html#base14) 這兩個部分都是賓語,它們是命令的操作對象。大部分的命令只有一個操作對象,也有一些命令是雙賓語結構的,具有一個直接賓語和一個間接賓語。比如 拷貝 這個命令 cp (copy)[[19](ch13s03.html#ftn.id3059634)]
**分隔符.?** 我們的漢語是象形文字,沒有分隔符。但是所有的拼音文字中都用空格作為分隔符,來分隔單詞。Linux 命令中同樣使用空格作分隔符。
上面的那句話,翻譯成 Linux 的命令,應該是這個樣子的:
```
推薦 --鄭重的 您 Linux
```
> [](ch13s03.html#base15) (按照傳統,“-”后跟選項縮寫,“--”后跟選項全稱。不過也有例外)
哈,Linux 的命令也蠻簡單吧?
* * *
> [[19](ch13s03.html#id3059634)] **cp a b** 表示把文件 a 拷貝為文件 b
> **cp??? a???? /home**表示把當前目錄下的 a 文件,拷貝到 /home 目錄下。(命令的不同部分使用空格分隔,連續的空格視為一個空格)
## Linux 程序、進程
或許您會這樣想,Linux 命令的句型確實不難,但是那么多命令,我怎么知道它們都是作什么的呢?而且不同的系統中,可以使用的命令似乎也不太一樣,這真讓人困惑……
其實 Linux 的命令,運行的是 Linux 系統中的程序。只要您已安裝了程序,您就可以通過命令來運行它,并且可以使用選項來精細的調整它的運行狀態。也可以通過點擊啟動圖標來運行,不過啟動圖標不能夠方便的調整選項,并不是很方便。
舉一個例子:
```
mplayer -shuffle -loop 3 -playlist mymp3.list
```
可能您運行上面命令,系統會提示您 無法找到命令 ,那是因為您沒有安裝 mplayer 這個程序。mplayer 是我見過的支持格式最多的播放器,幾乎任何已知格式的多媒體文件,都可以使用 mplayer 來播放。它包含一個圖形界面的前端,您可以在菜單中找到它,鼠標點擊運行;也可以通過執行命令來運行它的命令行版本。
如果您的系統中沒有 mplayer 播放器,我們建議您安裝一個。關于程序的安裝,參閱[第?16?章 _軟件管理_](ch16.html "第?16?章?軟件管理") 。
上面命令中, **mplayer** 調用了 mplayer 播放器程序。選項 **-shuffle** 表示隨機播放, **-loop** 表示循環播放,后面的 **3** 為循環的次數,如果為 **0** ,則一直播放。 **-playlist** 表示播放列表中的曲目。我們可以把 mp3 的路徑放到 `mymp3.list` 文件中,讓 mplayer 來播放它們。
**進程.?**為運行中的程序,是程序在內存中的鏡像。
好了,現在您已經了解了 Shell 、 命令 、 程序 、 進程 的概念,您基本上也就了解了 Linux(Linux 系統真是非常簡潔,而且容易理解)。
但只知道這些,您并不能順暢使用。接下來的章節中,我們來進一步介紹它的細節。
## 路徑
路徑分為絕對路徑和相對路徑。
絕對路徑的起始點為根目錄 `/` ,例如 /usr/local/bin 就是絕對路徑,它指向系統中一個絕對的位置,不受其它因素影響。
相對路徑的起始點為當前目錄,如果您現在位于 /usr 目錄,那么相對路徑 local/bin 所指示的位置為 /usr/local/bin
也就是說,相對路徑所指示的位置,除了相對路徑本身,還受到當前位置的影響。例如 Linux 系統中常見的目錄 /bin 、 /usr/bin 、 /usr/local/bin ,如果只有一個相對路徑 bin,那么它指示的位置可能上面三個目錄中的任意一個,也可能是其它目錄。
如果我告訴您到 bin 目錄尋找一個文件,您可能搞不清楚是哪一個 bin 目錄。只有當前位置確定,相對路徑指示的位置才能夠確定。
現在我說, /usr/local 目錄下,它的相對路徑 bin 中有某個文件,這樣就比較明確了。
在相對路徑中 . 表示當前目錄, `..` 表示當前目錄的上一級目錄。
假設您安裝了一個程序,它的主程序沒有被放置到上面三個 bin 目錄中的任何一個,或者其它系統能夠找到的地方,您就得告訴系統,它的可執行文件在哪里。
可以使用絕對路徑,例如: **/home/user/bin/可執行文件**
或者定位到 /home/user/bin 目錄,使用相對目錄來定位它 **./可執行文件**
路徑相關命令
```
cd (change directory) #更改目錄。
pwd (print working directory)#顯示當前路徑。
ls (list) #顯示當前目錄中的文件列表。
```
請嘗試以下操作:
```
cd /etc #進入“/etc”目錄,這里使用的是絕對路徑
pwd #顯示當前路徑,這個命令返回結果“/etc”
cd init.d #進入“/etc”目錄的子目錄“init.d”,這里使用的是相對路徑
cd .. #進入上一級目錄“/etc”
cd ../home #“/etc”目錄的上一級目錄為“/”,它的子目錄“home”為“/home”
cd - #回到上一次的目錄,我們在“/etc”目錄跳轉到“/home”目錄,所以這次是回到“/etc”目錄
cd ~ #“~”代表當前用戶的“$HOME”目錄,也就是“/home/{用戶名}”目錄。
ls #在任何時候,您都可以使用“ls”命令,來了解當前目錄下都有哪些文件。
```
遠程路徑:
遠程路徑的表示方法為 **協議://用戶名:密碼@位置/路徑:端口**
大多數的遠程路徑可以使用默認端口匿名訪問,由此用戶名、密碼、端口通常不需要填寫。例如:
```
http://linuxtoy.org
```
要求身份驗證的遠程路徑,您可以使用下面的方式訪問:
```
ftp://user:passwd@ftp.linuxtoy.org:21
```
## 軟件
Linux 中沒有 注冊表 這個概念。安裝軟件,理論上講,只要拷貝所有相關文件,并運行它的主程序就可以了。
按照傳統,一個軟件通常分別拷貝到同級目錄下的 bin、etc、lib、share等文件夾。
bin
可執行文件,程序的可執行文件通常在這個目錄下。在環境變量中設定搜索路徑,就可以直接執行,而不需要定位其路徑。
etc
配置文件,大部分系統程序的配置文件保存于 /etc 目錄,便于集中修改。
lib
庫文件,集中在一起,方便共享給不同程序。相較不同的軟件單獨保存庫文件,能夠節約一些磁盤空間。
share
程序運行所需要的其它資源,例如圖標、文本。這部分文件是專有的,不需要共享;而且目錄結構相對復雜,混放在一起比較混亂,所以單獨存放。
還有一些軟件,占用一個單獨的目錄,所有的資源都在這個目錄中。類似于 Windows 下的綠色軟件,不推薦在 Linux 系統下這樣作。
* 執行時,系統找不到可執行文件(搜索所有路徑,資源開銷過大,是不現實的),需要定位其位置,像這樣 **/home/user/bin/可執行文件** ,不夠方便。
* 許多系統軟件需要協作運行,配置文件分別保存,定位它們非常麻煩
* 如果程序使用的庫文件,像圖形庫文件,都單獨存放,那么磁盤空間的浪費會非常嚴重。
有一些大型軟件,或者您布署的重要應用,您可以將它們單獨安裝在一個文件夾下。(通常源碼安裝支持這種方式)
## 配置方式
Linux 下沒有類似 注冊表 的系統,系統和軟件都可以通過純文本的配置文件進行設置。
事實上,圖形界面的配置工具,通常就是以圖形界面的方式修改配置文件,適合設置一些比較簡單的程序。如果軟件有幾千個可以配置的選項,全部作成菜單,想象一下……開始發抖吧……
圖形界面的配置工具,可以看作特定配置文件專用編輯器。您一樣可以使用通用文本編輯器來編輯配置文件,比如 Nano、Gedit、Knote、Vim 或者 Emacs 等等。不考慮閱讀、修改配置文本占用的時間,直接修改配置文件甚至更迅速。[[20](ch13s07.html#ftn.id3060298)]
如果只是要修改某一常用選項,而且時常修改,比如主機的 IP地址。使用文本編輯器,您要找到相應的配置文件,還要在配置文件中找到相應的選項,會浪費掉您的時間和耐性。
圖形配置工具經常會受各種因素制約,比如網絡服務器中不提供圖形服務,圖形界面不夠穩定……這時,您可以使用命令行的配置工具來完成這些工作。
例如: 修改主機 IP地址,可以使用 ifconfig 這個程序,執行下面的命令:
```
ifconfig eth0 192.168.0.1
```
* * *
> [[20](ch13s07.html#id3060298)] 在以后的章節中,如果我們提示您修改某一文件,例如 `/etc/fstab` ,您可以使用任何順手的文本編輯器打開它。
## 隱藏文件
Linux 下,名稱中第一個字符為 _._ 的文件或者文件夾,系統會將它們隱藏起來。傳統上,這種文件大多是用戶的配置文件。
您可以嘗試以下操作:
```
cd ~ #進入您的用戶目錄
ls #查看當前目錄下的文件列表
ls -a #查看所有文件的文件列表(包括隱藏文件)。
```
* 如果您只想查看隱藏文件,而不包括這兩個特殊目錄,您可以使用 ls 命令的選項 -A (ls -A)
* 每個目錄下都包含兩個特殊目錄 `.` 和 `..` 。您也許猜到了, `.` 代表當前目錄, `..` 代表上一級目錄。
現在,您可以看到許多文件名以 . 起始的文件或者文件夾了吧?使用 ls 命令無法顯示它們
## 文件類型
Linux 系統主要根據文件頭信息來判斷文件類型,擴展名并非決定因素。
現在使用 **ls -l** 命令,查看詳細信息格式的文件列表,您將會看到如下內容:
```
total 5
drwxr-x--- 4 user group 4096 Mar 10 00:37 filename
drwxr-xr-x 21 user group 4096 Mar 10 20:16 文件名
-rw------- 1 user group 524 Mar 10 00:40 a
-rw-r--r-- 1 user group 24 Jun 11 2000 b
drwx------ 2 user group 4096 Mar 9 11:06 c
```
共顯示了七列信息,從左至右依次為:權限、文件數、歸屬用戶、歸屬群組、文件大小、創建日期、文件名稱
```
drwxr-xr-x
```
> [](ch13s09.html#base21) 其中要特別留意的是第一列:
| | |
| --- | --- |
| - | 普通文件 |
| d | 文件夾 |
| l | 符號鏈接 |
| b | 塊設備文件 |
| c | 字符設備文件 |
| s | 套接文件 |
| p | 管道文件 |
> [](ch13s09.html#base22) 剩下的9個字符分為3組:分別是歸屬用戶、歸屬群組、其它用戶對于該文件的權限。我們看它的格式
| | |
| --- | --- |
| r | 可讀 |
| w | 可寫 |
| x | 可執行 |
* 它們的順序不能顛倒,某一位置為空(-),則表示不具有相應的權限。
* Linux 下的可執行文件并不是由擴展名(例如 .exe )決定的,而是由其可執行權限位決定。
* 目錄是一種特殊類型的文件。擁有目錄的執行權限才可以進入這個目錄!
## 權限
我們已經知道了,文件的權限分為 r (可讀)、 w (可寫)、 x (可執行)三種類型,而一個文件可以針對歸屬用戶,歸屬群組,其它用戶或群組分別設定權限。
這種權限管理的方式靈活、簡單、嚴密、明晰。盡管如此,在最初的階段,可能會有一點小小的不適。因為它無所不在,而您習慣了的 Windows 的權限管理卻不是這樣(非常混亂,大多數時間形同虛設,偶爾用到卻讓人傷透腦筋)。
使用 chmod 命令更改文件的權限,使用 chown 來更改文件的歸屬。例如:
```
chmod 755 xxx
chmod a+x xxx
chown user:group xxx #用來更改文件的歸屬用戶,也可以同時更改其歸屬群組
chgrp group xxx #用來更改文件的歸屬群組
```
上面命令中的 755 和 a+x 是兩種類型的表達式
我們將在[“權限管理”一節](ch17s08.html "權限管理")中詳細介紹
### 執行命令的權限
有一些命令,普通用戶也可以執行,但是只有 root用戶 才能執行成功,這是為什么呢?
例如在系統中增加一個新用戶 useradd,我們看看這個命令的程序文件
```
ls -l /usr/sbin/useradd
-rwxr-xr-x 1 root root 56156 2006-04-03 21:37 /usr/sbin/useradd
```
所有的用戶都可以執行?
這是因為, useradd 命令是修改 `/etc/passwd` 文件的一個工具,來看看這個文件:
```
ls -l /etc/passwd
-rw-r--r-- 1 root root 1835 2006-06-24 17:58 /etc/passwd
```
原來只有 root用戶 才能寫入修改結果,非 root用戶 執行 useradd 命令當然不會有結果。
## 用戶
在 Linux 系統中,有兩種用戶:普通用戶、root用戶
root用戶擁有對系統的完全控制權。實際上這沒有看上去那樣的美妙,你必須對自己的行為負全部的責任。Linux 繼承了 Unix 的設計哲學:系統毫無保留的執行你下達的命令,哪怕這個命令是“向我開炮!”
普通用戶只可以作系統允許的事情。盡管可以執行大多數命令,但是 root 專有的命令卻不能成功的執行,因為這些命令往往關聯著只有 root 才可以處理的文件。也就是說,普通用戶通常只可以處理自己 `$HOME` 目錄下的文件。詳見 [“執行命令的權限”一節](ch13s10.html#rightofcom "執行命令的權限")
而作為 root用戶,可能會因為誤操作給系統帶來破壞;作為普通用戶,可以作的事情又太少了點。
### 執行命令的身份
默認情況下,您的命令提示符末位為 _$_ ,這表示您將以普通用戶的身份執行命令。
您可以使用 su (switch user)這個命令來切換其它用戶。
例如 **su root** ,切換到 root用戶(如果 su 命令后面沒有參數,那么這個命令默認切換到 root用戶)。
當您執行 su 這個命令,系統會提示您輸入密碼,請輸入管理員的密碼。這個時候,您會發現命令提示符末位變成了 **#** ,您將以 root用戶 的身份執行命令。
許多 Linux 系統默認會隨機設定系統的 root密碼,這樣更安全一些,這個時候您可以執行 sudo 命令,輸入當前用戶密碼后,暫時以 root用戶 的身份執行命令。(前提是 sudoer 列表中要包含您的 ID)
> 提示:使用 visudo (需要 root權限)可以將普通用戶加入到 sudoer 列表中。
但即便是用 sudo 來執行,也不能保證系統不會在您的誤操作下一命嗚乎,更安全的辦法是直接賦與用戶某種操作的權限。
```
gpasswd -a user audio
```
這個命令將 user 加入到 audio 群組,您擁有了使用音頻設備的權限。
事實上,Linux 中一切皆文件,包括設備文件。
```
ls -l /dev/sound
crw-rw---- 1 root audio 14, 4 10-04 09:41 audio
crw-rw---- 1 root audio 14, 3 10-04 09:41 dsp
crw-rw---- 1 root audio 14, 2 10-04 09:41 midi
crw-rw---- 1 root audio 14, 0 10-04 09:41 mixer
…………
```
可以看到,和音頻有關的設備文件,除了 root用戶 可以使用,audio群組 中的用戶也可以使用。
### 群組
群組分為兩種,主組和輔組。在 `/etc/passwd` 文件中,與用戶相關聯的是主組,每個用戶只可以加入一個主組;`/etc/group` 文件中則記錄了每一個輔組所包含的用戶,同一個用戶可以被多個輔組所包含。
這樣看起來有點亂,但卻可以提供更大的靈活性。例如:
```
crw-rw---- 1 root audio /dev/sound/audio
brw-rw---- 1 root optical /dev/cdrom
```
先假設一名用戶只可以屬于一個群組:你是系統管理員,你管理的用戶要求聽點音樂,你把他加入了 audio組;于是該用戶把 CD 放進了光驅,結果一點反映也沒有,于是為了讓他使用 cdrom,不得不讓他擁有 root權限,你將不能防范他可能作出的破壞。
而一名用戶可以屬于多個群組,能夠很好的解決這個問題:你可以讓可以用戶既屬于 audio群組,又屬于 optical群組,這樣他就可以用 cdrom 來聽音樂,卻沒有 root權限。
- 開源世界旅行手冊
- 授權
- 致謝
- 序言
- 更新紀錄
- 導讀
- 如何寫作科技文檔
- 部分?I.?氣候
- 第?1?章?GUI? CLI?
- 第?2?章?UNIX 縮寫風格
- 第?3?章?版本號的迷霧
- 第?4?章???Vim 還是 Emacs
- 第?5?章???DocBook 還是 TeX
- 第?6?章?完全用 Gnu/Linux 工作
- 第?7?章?病毒
- 第?8?章?磁盤 分區
- 第?9?章?文件系統
- 第?10?章???發行版介紹
- 第?11?章???編程語言
- 第?12?章?無根的根:無名師的 Unix 心傳
- 部分?II.?地理
- 第?13?章?基礎知識
- 第?14?章?命令系統
- 第?15?章?基本系統
- 第?16?章?軟件管理
- 第?17?章?核心工具集
- 第?18?章?編譯工具鏈
- 第?19?章?圖形界面
- 第?20?章?國際化
- 第?21?章???內核
- 第?22?章?Grub
- 第?23?章?服務器
- 第?24?章?Vim 編輯器
- 第?25?章?Emacs 入門
- 第?26?章?正則表達式
- 第?27?章?docbook 指南
- 第?28?章?Git 版本控制系統
- 第?29?章?ConTeXt 入門指南
- 部分?III.?景觀
- 第?30?章?終極 Shell -- ZSH
- 第?31?章?完美工作站 Archlinux
- 第?32?章?組織你的意念:Emacs org mode
- 第?33?章???Zsh+screen
- 第?34?章???gentoo stage3
- 第?35?章???硬件問題
- 第?36?章???網絡設置
- 第?37?章???自制 LiveCD
- 第?38?章?awesome
- 第?39?章?openbox 工作環境
- 第?40?章???Emacs muse
- 第?41?章???寫作工具鏈
- 第?42?章?使用 lftp
- 第?43?章???Firefox 使用技巧
- 第?44?章???FVWM
- 部分?IV.?地質
- 第?45?章?Unix
- 第?46?章???Gnu
- 第?47?章?軟件業自由之神——Richard Stallman
- 第?48?章?Linux
- 第?49?章?GNOME與KDE的戰爭
- 第?50?章???Vim Emacs
- 第?51?章???年代紀
- 第?52?章?我的選擇
- 第?53?章???補遺