3.9. Shells
前一頁 | 章 3. UNIX 基礎概念 | 下一頁

## 3.9. Shells

在 FreeBSD 中，很多日常的工作是在一個叫做 shell 的文字介面中完成的。 Shell 的主要工作就是從輸入中收到命令並執行它們。 許多 shell 也有內建一些有助於日常工作的指令， 像是檔案管理、檔案比對、命令列編輯、指令巨集以及環境變數等。 FreeBSD 有內附了幾個 shell，像是 `sh`， Bourne Shell，以及 `tcsh`，改良版的 C-shell。 還有許多其他的 shell 可以從 FreeBSD Ports Collection 中取得，像是 `zsh` 以及 `bash` 等。

您用哪個 shell 呢？ 其實每個人的喜好都不一樣。 如果您是一個 C 程式設計師，那對於使用像是 `tcsh` 這種 C-like 的 shell 可能會感到相當愉快。 如果你是從 Linux 跳過來的，或者您是一個 UNIX® 新手，那您也許會想要用 `bash` 來當作文字介面。 每一個 shell 都有自已獨特之處，至於這些特點能不能配合您的工作環境？ 那就是您選擇 shell 的重點了。

檔名自動補齊就是常見的 shell 功能。 首先輸入指令或檔案的前幾個字母，這時通常您只需要按下 Tab 鍵，接下來 shell 就會自動把指令或是檔案名稱剩餘的部份補齊。 假設您有兩個檔案分別叫作 `foobar` 及 `foo.bar`。 現在要刪掉 `foo.bar`，那麼可以輸入： `rm fo[Tab].[Tab]`

Shell 會印出這個： `rm foo[嗶].bar`。

[嗶] 是 console 的響鈴，這嗶的一聲是 shell 在告訴我說它沒有辦法完全自動補齊檔名，因為有不只一個檔名符合條件。 `foobar` 和 `foo.bar` 都是 `fo` 開頭的檔名，不過它至少可以補齊到 `foo`。 如果您接著輸入 `.` 然後再按 Tab 一次，那 shell 就能夠替您把剩下的檔名填滿了。

Shell 的另一項特點是使用了環境變數。 環境變數是以變數與鍵值（variable/key）的對應關係儲存於 shell 的環境空間中，任何由 shell 所產生的程序都可以讀取此空間， 因此這個空間儲存了許多程序的設定組態。 在此附上 一份常見環境變數與其涵義的列表：

變數 | 詳細說明
--- | ---
`USER` | 目前登入的使用者名稱。
`PATH` | 以冒號（:）隔開的目錄列表，用以搜尋執行檔的路徑。
`DISPLAY` | 若存在這個環境變數，則代表 X11 連結顯示器的網路名稱。
`SHELL` | 目前使用的 shell。
`TERM` | 使用者終端機的名稱，能藉由此變數判斷終端機的能力。
`TERMCAP` | Database entry of the terminal escape codes to perform various terminal functions.
`OSTYPE` | 作業系統的種類，如：FreeBSD。
`MACHTYPE` | 目前系統所用的 CPU 架構。
`EDITOR` | 使用者偏好的文字編輯器。
`PAGER` | 使用者偏好的文字分頁器（text pager）。
`MANPATH` | 以冒號（:）隔開的目錄列表，用以搜尋 manual pages 的路徑。

在不同的 shell 底下設定環境變數的方式也有所不同。 舉例來說，在 C-Style 的 shell 底下，像是 `tcsh` 和 `csh`，你必須使用 `setenv` 來設定環境變數。 但在 Bourne shells 底下，像是 `sh` 和 `bash`，你則必須使用 `export` 來設定你所使用的環境變數。 再舉個例子來說，若要設定或是修改 `EDITOR` 這個環境變數，在 `csh` 或 `tcsh` 下設定 `EDITOR` 這個環境變數為 `/usr/local/bin/emacs` 的指令是：

`%` `setenv EDITOR /usr/local/bin/emacs`

在 Bourne shells 下則是：

`%` `export EDITOR="/usr/local/bin/emacs"`

大多數的 shell 都支援使用者在命令列中將 `$` 字元放在變數之前，以取得環境變數的值。 舉例來說，`echo $TERM` 會 顯示出 `$TERM` 的設定值，這是因為 shell 取得了 `$TERM` 的設定值， 並將其傳給 `echo` 顯示出來。

Shell 中有某些特別的字元是來表示特殊的資料，我們將其稱作 meta-characters。 其中最常見的是 `*` 字元，他代表了檔名中的任意字元。 這些特殊字元可以用在檔名展開（filename globbing）上，舉例來說，輸入 `echo *` 會和輸入 `ls` 得到幾乎相同的結果，這是因為 shell 會將所有符合 `*` 字元的檔案傳到命令列上，再由 `echo` 顯示出來。

為了避免 shell 轉譯這些特殊字元，我們可以在這些特殊字元前放一個反斜線 (`\`) 字元使他們跳脫(escape) shell 的轉譯。舉例來說， `echo $TERM` 會印出你目前設定的終端機格式， `echo \$TERM` 則會直接印出 `$TERM` 這幾個字。

### 3.9.1. 變更你的 Shell

變更 shell 最簡單的方法就是透過 `chsh` 命令。 執行 `chsh` 將會呼叫環境變數中 `EDITOR` 指定的文字編輯器。 如果沒有設定，則預設是 `vi`。 請依照需求去修改 “Shell:” 的值。

你也可以透過 `chsh` 的參數 `-s`， 這可以直接設定你的 shell 而不需要透過任何文字編輯器。 例如， 假設想把所用的 shell 改為 `bash`， 可以透過下列的方式：

`%` `chsh -s /usr/local/bin/bash`

### 注意:

你所使用的 shell 必須 列於 `/etc/shells` 裡頭。 如果是由 Ports Collection 來裝 shell， 那這個步驟已經完成了。 但若是手動安裝了一個 shell， 那麼就必須為新安裝的 shell 進行設定。

舉例來說，若手動安裝了 `bash` 並將它置於 `/usr/local/bin` 底下，你還得：

`#` `echo "/usr/local/bin/bash" >> /etc/shells`

然後再重新執行 `chsh`。

前一頁 | 上一層 | 下一頁
3.8. Daemon、信號及終止程序 | 起始頁 | 3.10. 文字編輯器

本文及其他文件，可由此下載： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。

若有 FreeBSD 方面疑問，請先閱讀 FreeBSD 相關文件，如不能解決的話，再洽詢 <questions@FreeBSD.org>。
關於本文件的問題，請洽詢 <doc@FreeBSD.org>。