## 第?14?章?命令系統
**目錄**
[](ch14.html#id3062639)
[Shell、Console、Terminal](ch14s02.html)
[rxvt-unicode](ch14s03.html)
[幫助系統](ch14s04.html)
[bash](ch14s05.html)
[中止正在運行的程序](ch14s05.html#id3063134)
[Ctrl+s](ch14s05.html#id3063154)
[鍵綁定](ch14s05.html#id3063175)
[自定義鍵綁定](ch14s05.html#id3063672)
[](ch14s06.html)
[通配符](ch14s06.html#glob)
[任務管理](ch14s06.html#id3063827)
[管道、重定向](ch14s06.html#id3063966)
[脫字符](ch14s06.html#id3064064)
[設定您的默認 Shell](ch14s07.html)
[設定命令的搜索路徑](ch14s08.html)
## Shell、Console、Terminal
在前面的章節中,我們曾提到,電視機的遙控器,也是一種人機交互的界面,算是一種 Shell。
但是這個概念并不準確,遙控器只是向 Shell 發送指令的工具,Shell 接收到遙控器發出指令后,將指令轉換為系統命令,由系統來執行。
例如我們按的遙控器上的 數字鍵1 ,遙控器將 切換為1頻道 的指令發送到 Shell,Shell 將指令轉換為系統可以識別的 頻道1 ,系統執行它,您就可以觀看 1頻道 的電視節目了。
通常每臺電視機只有一種 Shell,比如有的電視機系統具有“畫中畫”的功能,那么 Shell 中便有相應的功能定義,您可以通過遙控器上的“畫中畫 ”功能鍵來開啟它。假設您的電視機沒有此功能,Shell 中也就沒有相應的功能定義。擁有一個帶“畫中畫”功能控制鍵的遙控器,即便信號兼容,您還是不能夠使用這一功能
不用遙控器也可以控制電視機,假設您的遙控器丟了,您還可以走到電視機前,使用機身上的控制面板來控制它(相當于使用 Linux 的控制臺)。但是您一定不喜歡這種方式,除非您想鍛煉身體
在 Linux 系統中,由于圖形界面和控制臺的分辨率通常不一致,所以切換時要有一個延時。對于我們中文用戶來講,控制臺下中文的顯示也比較麻煩。而且控制臺顯示內容通常不如終端顯示的全面。
所以我們推薦您使用終端來執行命令,它使用起來感覺很像遙控器
## rxvt-unicode
通常情況下,您買一臺電視機,只能獲得一個遙控器。雖然它為您的電視機量身定作,能夠最大限度發揮電視機的能力,但您卻不一定喜歡它。說不定這個遙控器體形太大,持握不方便;或者它體形太小,容易失蹤;又或者它的按鍵要么太硬,要么太軟;它的鍵盤要么太大,要么太小……
您一般也可以容忍,畢竟遙控器使用頻率并不算高
如果您的終端有些地方不討您喜歡,比如說響應太慢,或者不能正常顯示中文……那就難以忍受了,您應該換一個其它的試試。
您所接觸的第一個終端極有可能是 Gnome-Termianl,它是系統默認使用的終端,顯示中文不錯,不過響應比較慢。。。
我們推薦您使用 urxvt(mlterm 也是不錯的選擇)
您可以使用 **sudo apt-get install rxvt-unicode** 命令來安裝它。
`urxvt` 啟動它 (urxvt 不支持控制臺,您得在圖形界面下啟動它。使用終端,或者按下 Alt+F2,建議您在啟動欄里新建一個啟動圖標)
rxvt-unicode 還支持“服務器/客戶端”的運行模式:
* `urxvtd` 啟動一個守護進程 daemon(支持控制臺)
* `urxvtc` 啟動客戶端 client。多個客戶端可以同時連接到一個 urxvtd,以達到節省系統資源的目的。
或許您對 rxvt 的默認設置不滿意,您可以修改用戶配置文件 `~/.Xresources` 來設定它。修改全局配置文件 `/etc/X11/Xresources/Xresources` ,則對所有用戶生效,只有 root 才可以修改此文件。
這里有一些簡單的選項:(以 ! 起始的行是注釋,您可以直接拷貝此文件的內容)
**例?14.1.?urxvt 配置 `~/.Xresources`**
```
!!=============================================================================
!! RXVT-unicode setting
!!=============================================================================
!設置字體分辨率
Xft.dpi:96
!設置字體
URxvt.font:-misc-fixed-medium-r-normal--14-*-*-*-*-*-iso10646-1,xft:WenQuanYi Bitmap Song:size=10
!顏色
Rxvt.background:black
Rxvt.foreground:white
Rxvt.colorBD:yellow
Rxvt.colorUL:green
!滾動條
Rxvt.scrollBar:True
Rxvt.scrollBar_right:True
Rxvt.scrollBar_floating: False
Rxvt.scrollstyle:plain
!屏幕緩沖
Rxvt.saveLines:10000
Rxvt.color12:DodgerBlue
Rxvt.menu:/etc/X11/rxvt.menu
Rxvt.preeditType:Root
!輸入法設置
!inputMethod:xim
```
## 幫助系統
您可以使用命令 man 或者 info 來閱讀 Linux 命令的在線文檔。命令的格式非常簡單:
```
man xxx
```
> 提示:在使用 man 瀏覽器的時候,一些快捷鍵您可能會用到:
| | |
| --- | --- |
| Ctrl+f(orward) | 向下翻一頁 | Ctrl+d(own) | 向下翻半頁 |
| Ctrl+b(ackward) | 向上翻一頁 | Ctrl+u(p) | 向上翻半頁 |
| / | 查找 | q(uit) | 退出 |
以上為 VI風格 的鍵綁定。您也可以使用 Emacs風格 的[鍵綁定](ch14s05.html#keybind "表?14.1.?Emacs風格 鍵綁定")
## bash
好了,現在我們換了一個遙控器,感覺順手多了。現在來操練一下,下載一首 mp3:
我們使用 wget 這個程序,它非常可靠,完全值得您信賴。
首先找到一個可以下載的地址,復制鏈接,在終端窗口內點擊鼠標中鍵,把它粘貼進去。
現在終端中大概是這種情形:
```
http://linuxtoy.org/xxx.mp3
```
按下 `Ctrl+a` 組合鍵,我們發現光標移動到了行首。輸入 `wget` 和 `空格`
```
wget http://linuxtoy.org/xxx.mp3
```
回車后,終端中出現一些信息,不一會兒工夫,mp3 便下載完成。
使用 `Ctrl+a` 組合鍵,我們就不需要使用方向鍵來移動光標,方向鍵每次只能移動一個字符,沒有效率
您還可以使用 `Ctrl+f` 向前移動光標, `Ctrl+b` 向后移動光標, `Ctrl+e` 將光標移動到行末……([鍵綁定](ch14s05.html#keybind "表?14.1.?Emacs風格 鍵綁定"))
> 注意:Linux 的圖形界面中,鼠標中鍵通常執行“粘貼”的操作,如果您的鼠標沒有中鍵,您可以左右鍵同時按下。
### 中止正在運行的程序
如果一個命令持續時間很長,以致于不能夠進行其它操作,可以使用 `Ctrl+c` 來強行中止它。
### Ctrl+s
有時您會不小心按下 `Ctrl+s` 這個組合鍵,Shell 便被凍結。嘗試使用 `Ctrl+q` 組合鍵,看能否恢復正常。
### 鍵綁定
等等,有必要記這么多快捷鍵么?都這么復雜!
我們強烈建議您記住,以大幅度的提高操作效率。而且這是 readline 控件的鍵綁定,在任何使用 readline 控件的程序中,您都可以使用它們。例如 bash、lftp、gdb 等程序;同時,Linux 下倍受追捧的 Emacs 編輯器,也是這種風格的鍵綁定(其實是 readline 使用了 Emacs風格 的鍵綁定才對),甚至 FireFox 中,也可以使用類似風格的快捷鍵!(Linux 下主要有兩種風格的鍵綁定,一種是 Emacs風格,另一種是 Vi風格,我們會在 [第?24?章 _Vim 編輯器_](ch24.html "第?24?章?Vim 編輯器") 中介紹)
現在列舉一些 ReadLine 的鍵綁定,您可以自行嘗試。(運行 `man readline` 命令,來查看 ReadLine 手冊)
先來了解一些約定:
* \C-a 表示 `Ctrl+a`
* \M-a 表示 `Meta+a` Meta鍵 在 PC 中通常為 ALT鍵
**表?14.1.?Emacs風格 鍵綁定**
| | |
| --- | --- |
| | 向前 | 向后 |
| 移動 |
| 行 | \C-a | Ahead | \C-e | End |
| 字符 | \C-f | Forward | \C-b | Backward |
| 單詞 | \M-f | \M-b |
| 命令 | \C-n | Next | \C-p | Previous |
| 刪除 |
| 行 | \C-u | \C-k |
| 字符 | \C-h | \C-d |
| 單詞 | \C-w | \M-d |
| 搜索 |
| 搜索 | \C-r (連續使用 C-r 可以查找下一個) |
| 瀏覽搜索結果 | \M-n | \M-p |
| 其它 |
| 粘貼 | C-y |
| 撤銷 | C-- |
| 清空屏幕 | C-l |
_自動補全_
| | |
| --- | --- |
| Tab | 使用頻率最高的功能! |
| \C-o | 遍歷補全 | (未定義) |
| \M-? | 列出所有可能選項,相當于按兩次 Tab鍵 | Alt+Shift+/ |
| \M-# | 注釋掉當前命令,用于將當前命令暫存于歷史紀錄列表 | Alt+Shift+3 |
| \M-! | 補全命令,通常用來補全子命令,例如 ``sudo`` 的子命令 | Alt+Shift+1 |
| \M-~ | 補全用戶名 | Alt+Shift+` |
| \M-@ | 補全主機名 | Alt+Shift+2 |
| \M-$ | 補全變量 | Alt+Shift+4 |
| \M-_ | 補全歷史紀錄中的紀錄 | Alt+Shift+- |
| \M-* | 將所有可能選項放到命令行中 | Alt+Shift+8 |
### 自定義鍵綁定
通過修改 `/etc/inputrc` 文件,可以更改鍵綁定。建議您使用默認的鍵綁定,以避免不必要的煩惱。當然了,Emacs風格 的鍵綁定是通用的,隨時都有可能用到。
在文件中添加該行,可以將 ReadLine 的鍵綁定設為 VI風格。(Bash、Lftp 等使用 ReadLine 的軟件同時生效)
```
set editing-mode vi
```
找到這一行:
```
$if mode=emacs
```
在它的下面添加如下內容
```
"\C-o": menu-complete
###這兩行不是必須的,視情況而定###
"\C-p": non-incremental-reverse-search-history
"\C-n": non-incremental-forward-search-history
```
重新登錄 Shell,您就可以使用 `\C-o` (Ctrl+o)來遍歷補全。假如您的文件名為中文,或者出現亂碼時,您可以使用 `\M-*` 將所有文件名放入命令行,再刪除多余的,這真是麻煩極了!簡單一點的方法是使用 `\C-o` 遍歷補全,將所有可能的選項輪流放入命令行。
> 提示:使用 Vim編輯器, **vi /etc/inputrc** ,在插入模式下使用 `Ctrl+v` 組合鍵。按下 `Ctrl+o` ,這時編輯區新增一個 ^O 字符,等價于 `\C-o`
### 通配符
使用 _?_ 代表任意單個字符。例如 ???lo ,表示 lo 前有三個字符,它可以匹配 Hello
使用 _*_ 代表隨意幾個任意字符。例如 *.iso ,代表所有 iso 格式的文件。
您可以將遍歷補全和通配符結合使用,以提高效率。例如:
```
cd */ 則遍歷補全只補全文件夾
chmview *.chm 則遍歷補全只補全 chm 文件
```
### 任務管理
&
在命令的末尾加上一個 & 符號,表示背景任務,例如:
```
wget http://www.download.net/xxx/mp3 &
```
;
使用 ; 將多個命令連結起來,則表示任務按順序執行
&&
使用 && 將多個命令連結起來,則表示只有前面的命令執行成功,后面的命令才能得以執行
``
`(命令)` ,如果一個命令中包含以 `` (Esc鍵 下方的按鍵)括起來的子命令,那么子命令將被優先執行,執行結果被代入上一級命令繼續執行,例如創建一個以當前時間命名的文件:
```
touch `date +%m.%d_%H:%M:%S`
```
touch 命令能夠創建一個文件,它的操作對象,為 date +%m%d%H%M%S 命令的輸出 06.06_06:06:60
這樣,我們創建了一個名為 06.06_06:06:60 的文件(六月六日六時六分剛過六十秒-_-!)
Ctrl+z
將當前 Shell 中的任務掛起,這個時候任務的狀態為
```
[1]+ Stopped xxx
```
bg
將掛起的任務背景運行。這時它的狀態為
```
[1]+ xxx &
```
fg
將背景任務調到前臺執行
jobs
查看背景任務,方括號中的數字為命令的任務編號
如果后臺運行多個任務,您可以在 bg 或者 fg 后跟任務編號,作為操作對象,例如:
```
bg 2
```
### 管道、重定向
>
重定向符號,它的作用是將命令的輸出重定向到一個文件中。比如我們想把命令 **ls** 的結果保存為 `FileList` 文件,作一個清單,我們可以使用重定向符號來完成它:
```
ls -l > FileList
```
>>
作用與 > 基本相同,不同點在于, >> 以追加的方式,將命令的輸出寫入文件的末尾。
<
是從文件到命令的重定向,將文件的內容作為命令的輸入。
|
為管道符號,它的作用是將前一個命令的輸出,作為下一個命令的輸入。假設一個目錄下的文件太多,使用 ls 命令不能夠在屏幕中完全顯示,這個時候您可以將 ls 命令的輸出,通過管道符號,作為瀏覽器 less 的輸入。就可以使用瀏覽器的功能翻頁、查找:
```
ls -al | less
```
> 提示:less 瀏覽器的鍵綁定幾乎與 man 相同,請參閱[“幫助系統”一節](ch14s04.html "幫助系統")
### 脫字符
Shell 中的一些功能是通過特殊符號作為控制字符來實現的,上面已經介紹了很多了。這產生一個問題,如果一個文件名中,剛好包含了這些字符,比如 ; ,就很難對它進行操作。使用 less 瀏覽這個文件
```
less ;xxx
```
less 會很快返回一個錯誤信息,因為并沒有一個文件名作為操作對象。接著,Shell 會報告,系統中沒有 xxx 這個命令。
這是因為 Shell 將文件名中的 ; 解析為按順序執行命令。
或者您的文件名以空白起始,而在 Shell 中,無論多少個空格,都將被解析為一個分隔符。您甚至不能使用命令重命名此文件。
這個時候就要用到脫字符 _\_ 了,它能夠將一個具有特殊涵義的字符轉換普通字符。上面的兩個任務,可以在文件名中每個特殊字符前加一個 \ ,像這樣
```
less \;xxx
less \ \xxx
less \;\ \&\xxx
```
> 提示:也可以使用 " 將文件名括起來,例如 **less "; &xxx"** ,在很多情況下,這樣甚至更方便。
脫字符在 Shell 中也可以作為換行符,在一個命令的末尾添加一個 \ ,然后回車,在下一行繼續輸入命令剩余的部分,將一個命令拆分為多行且不影響它的執行(如果執行一個很長的命令,請將它拆分為多行以便于閱讀)
事實上換行符也符合脫字符的定義。回車鍵有兩個涵義,一個是 執行 (Enter),另一個 換行 (折線箭頭)。在 Shell 中它作為控制字符 執行 ,使用脫字符后,它便代表排版字符 換行 了。
## 設定您的默認 Shell
如果能夠擁有 root權限,可以直接修改 `/etc/passwd` 文件。找到您 用戶ID 起始的行
```
user:x:1000:112:user,,,:/home/user:/bin/bash
```
> [](ch14s07.html#command11) 用戶登錄名
> [](ch14s07.html#command12) 用戶口令(通常轉儲在`/etc/shadow`文件中)
> [](ch14s07.html#command13) 用戶UID
> [](ch14s07.html#command14) 用戶GID
> [](ch14s07.html#command15) 用戶信息
> [](ch14s07.html#command16) 用戶`$HOME`目錄位置
> [](ch14s07.html#command17) 最后一個字段為登錄后的默認 Shell, `/bin/bash` 是程序 bash 的主程序路徑。 Zsh 主程序的路徑通常為 `/bin/zsh`
`/etc/shells` 中列出系統中所有可用 Shell( `/bin/false` 代表禁用 Shell)
也可以使用如下命令更改您的默認 Shell
```
chsh -s /bin/zsh
(需要輸入您的密碼)
```
## 設定命令的搜索路徑
使用 **echo $PATH** ,可以顯示 `$PATH` 變量,輸出如下:
```
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/bin/X11 /usr/games /usr/X11R6/bin
```
它是一個環境變量,代表執行命令時,Shell 的搜索路徑。
執行一個命令時,Shell 會到 `$PATH` 變量定義的路徑去搜索,并運行與命令同名的可執行文件。如果程序、腳本等可執行文件并不在上面的路徑中,就必須使用絕對路徑或者相對路徑定位可執行文件。
例如:
```
/usr/local/mplayer -menu xxx.rmvb
cd /usr/local/ && ./mplayer -menu xxx.rmvb
```
可以修改 `/etc/environment` 文件來設定您的命令搜索路徑,找到 PATH 起始的行
```
PATH="$PATH:/user/"
```
在雙引號中添加您的自定義路徑,并以 _:_ 分隔。
- 開源世界旅行手冊
- 授權
- 致謝
- 序言
- 更新紀錄
- 導讀
- 如何寫作科技文檔
- 部分?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?章???補遺