命令行解釋器 - Arch Linux 中文维基

跳至內容

# 命令行解釋器

出自 Arch Linux 中文维基

相關文章

- 核心工具
- dotfiles

翻譯狀態：

- 本文（或部分內容）譯自 Command-line shell，最近一次同步於 2025-10-24，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

根據 Wikipedia:

  Unix shell 是為 Unix 和類 Unix 系統提供傳統用戶界面的命令行解釋器或 shell，通過執行用戶輸入的命令文本，或包含命令的文本腳本來指導計算機的運行。

## Shell 列表

或多或少符合 POSIX 的 Shell 列在 #符合 POSIX 下，語法不同的 Shell 列在 #其他 Shell 下。

### 符合 POSIX

可以從 `/usr/bin/sh` 連結到這些 Shell。當使用 `sh` 名稱調用 Bash、mkshAUR 和 zsh 時，它們會自動變得更符合 POSIX。

- Bash — Bash 擴展了 Bourne shell，支持命令行歷史和補全、索引和關聯數組、整數算術、進程替換、here document、正則表達式匹配和大括號展開。

  https://www.gnu.org/software/bash/ || bash包

- Dash — Almquist SHell (ash) 的 NetBSD 版本的後代。快速且符合 POSIX 的 Shell，以儘可能小為目標。

  http://gondor.apana.org.au/~herbert/dash/ || dash包

- KornShell（ksh） — KornShell 語言是完整、強大的高級程式語言，通常比其他高級語言更容易快捷。這使得它特別適合於原型開發。Ksh 擁有 Bourne shell 和 C shell 的最佳特性，以及獨有的許多新特性。因此，無論是系統交互，還是編程，ksh 都可以大大提高工作效率和質量。Ksh 程序更容易編寫，並且比用 C 等低級語言編寫的程序更簡潔和可讀。

  http://www.kornshell.com || ksh包

- nsh — 類似於 Fish 的命令行 shell，但兼容 POSIX。

  https://github.com/nuta/nsh || nsh-gitAUR

- Oil Shell（OSH） — Oil Shell 是兼容 Bash 的 UNIX 命令行 Shell。OSH 可以在大多數類 UNIX 作業系統上運行，包括 GNU/Linux。它是用 Python (v2.7) 編寫的，但附帶了一個原生可執行文件。OSH 使用的 Bash 方言稱為 OSH 語言。

  https://oils.pub/ || oil包

- Yash — Yet another shell（另一個 shell）是用 C99（ISO/IEC 9899:1999）編寫的符合 POSIX 的命令行 shell。Yash 旨在成為最符合 POSIX 的 shell，同時支持日常交互和腳本使用。

  https://magicant.github.io/yash/ || yashAUR

- Zsh — 為交互式使用而設計的 Shell，同時也是一門強大的腳本語言。Bash、ksh 和 tcsh 的許多有用特性都被合併到 Zsh 中，還添加了許多原創特性。介紹性文檔詳細介紹了 Zsh 的一些特性。

  https://www.zsh.org/ || zsh包

提示：可以用 shellcheck包 lint POSIX 和 Bash 腳本。

### 其他 Shell

- C shell (tcsh) — 命令語言解釋器，既可用作交互式登錄 shell，也可用作 shell 腳本命令處理器。其包含命令行編輯器，可編程單詞補全， 拼寫修正，歷史機制，任務控制和類 C 句法。

  https://www.tcsh.org || tcsh包

- Closh — 基於 Clojure 的類 Bash shell。

  https://github.com/dundalek/closh || closhAUR

- Elvish — Elvish 是一個現代、富有表現力的 shell。可以通過管道傳輸內部結構值。這一功能可以避免大量複雜的文本處理代碼。它是一種表現力豐富的程式語言，具有異常、命名空間和匿名函數等功能。它具有強大的讀入行功能，可在鍵入時檢查語法，默認情況下還具有語法高亮功能。

  https://elv.sh || elvish包

- fish — 智能、用戶友好型命令行 shell。Fish 採用全色命令行句法高亮，也對命令及其參數、文件存在性和歷史提供高亮和補全。其也支持對歷史和命令的輸入實時補全。Fish 還能夠解析系統 man 手冊頁面，以決定命令的有效參數，從而實現高亮和補全。可以採用 `Alt+Up` 對上一命令進行修改。fish 守護程序（fishd）對歷史和通用且持續的環境變量，在所有 fish 實例間進行同步。而且，fish 具有極度簡潔的編程句法和類似 ruby 的控制流。參見教程以獲得更多信息。

  https://fishshell.com/ || fish包

- ion — Ion 是一個現代系統 shell，具有簡潔但強大的句法。全部使用 Rust 編寫，這極大提升了 shell 的整體質量和安全性，消除了類似於 ShellShock 的漏洞的可能，也簡化了開發。利用其功能，Ion 還能提供超越 Dash 的性能水平。儘管它伴隨且主要為了 RedoxOS 開發，在其它 *nix 平台上也完全可用。參見用戶手冊以獲得更多信息.

  https://gitlab.redox-os.org/redox-os/ion/ || ion-gitAUR

- Murex — 改進功能和增強用戶體驗的命令行 shell。

  https://murex.rocks/ || murexAUR

- nushell — Nu 從函數式程式語言、現代命令行接口工具中汲取靈感。其不將文件和服務視為純文本流，而是將輸入視為有結構之物。

  https://www.nushell.sh || nushell包

- Oh — Go 編寫的 Unix shell。其主旨類似其他 Unix shell，但細節有所不同。在沒有犧牲 shell 的交互功能的條件下，Oh 擴展了 shell 的程式語言功能。

  https://github.com/michaelmacinnis/oh || oh-gitAUR

- PowerShell — PowerShell 是一種面向對象的程式語言和交互式命令行 shell。原先為 Windows 編寫且被其獨占。後來被開源、移植到 Linux 和 MacOS 上。

  https://github.com/PowerShell/PowerShell || powershellAUR

- rc — Plan 9 的命令解釋器，功能與 UNIX 的 Bourne shell 類似，也增加了一些小功能，語法也不那麼獨樹一幟。

  https://doc.cat-v.org/plan_9/4th_edition/papers/rc || 9base包

- xonsh — 由 Python 驅動的 shell，附加 Bash 和 IPython 中常用的 shell 原語。

  https://xon.sh/ || xonsh包

## 更改默認 Shell

在安裝上面的 Shell 之後，運行其可執行文件即可在當前 Shell 中直接執行。但是，如果想在登錄時直接使用，則需要更改默認 Shell。

列出所有已安裝的 shell：

    $ chsh -l

為當前用戶設置默認 Shell：

    $ chsh -s /full/path/to/shell

如果使用 systemd-homed，請運行：

    $ homectl update --shell=/full/path/to/shell 用户名

其中 `/full/path/to/shell` 是 `chsh -l` 提供的完整路徑。

注意：新用戶的默認 shell 是 Bash。要切換回 Bash，以上命令 shell 路徑採用 `/usr/bin/bash` 即可。

如果現在註銷並再次登錄，就將使用新設置的 Shell。

提示：chsh 會參考 `/etc/shells`。如果最近安裝的 Shell 不在列表中，可以手動將其添加到此文件中。

## 卸載 Shell

警告：不遵循以下步驟可能會導致用戶無法訪問能用的 Shell。

移除 Shell 軟體包前先更改默認 Shell。

或者，修改用戶資料庫（英語：user database）。

對於每個設置了除 bash 之外的 Shell 作為登錄 Shell 的用戶（如果有必要，也包括 root 用戶）執行這一操作。完成後就可以移除軟體包。

## 登錄 Shell

登錄 Shell 是一種調用模式，在這種模式下，Shell 讀取一次性初始化文件，例如系統範圍的 `/etc/profile`、用戶的 `~/.profile` 或其他特定於 Shell 的文件。這些文件將會設置初始環境，且會被所有從 Shell 啟動的進程（包括其他非登錄 Shell 或圖形程序）繼承。因此，其只會在會話開始時讀取一次，例如，在控制台或通過 SSH 登錄、使用 `--login` 參數通過 sudo 或 su 切換用戶、手動調用登錄 Shell（例如，通過 `bash --login`）。

可在#配置文件及其所包含的連結中查看各種初始化文件的概述。參見 Stackexchange 上的登錄 Shell 和非登錄 Shell 之間的區別？（英文）和為什麼要用「登錄」Shell 而不是「非登錄」Shell？（英文）了解更多有關登錄 Shell 的信息.

## 配置文件

要在登錄時或在控制台中自動啟動程序，可以使用 Shell 啟動文件或目錄。閱讀 Shell 的文檔或其對應文章，例如 Bash#配置文件或 Zsh#啟動/結束文件（英語：Zsh#Startup/Shutdown files）。

Wikipedia:Unix shell#Configuration files 中有對各種 Shell 配置文件的比較。

### /etc/profile

在登錄時，所有兼容 Bourne Shell 的 Shell 都會讀取 `/etc/profile`，而 `/etc/profile` 又會讀取 `/etc/profile.d/` 中任何可讀的 `*.sh` 文件：這些腳本不需要解釋器指令，也不需要具有可執行權限。它們用於設置環境並定義特定於應用程式的設置。

### 標準化

可以使（某些）Shell 配置文件遵循相同的命名約定，並支持一些 Shell 之間的共同的配置。

請參閱相關文章和相關存儲庫，也請參閱xsh。

## 輸入與輸出

另見 GregsWiki 及 I/O 重定向。

- 重定向在命令執行前截斷文件：因此使用

      $ command file > file

  命令不會達到預期效果。的確，有部分命令（例如 sed） 提供就地編輯文件的選項，但大部分不會。這時，可用 moreutils包 的 sponge(1) 命令。
- 因為 cat 不是 shell 內置的，所以，多數情況下，您可能發現使用重定向更方便。例如，在腳本中或在苛求性能的情況下。事實上 `< file` 等價於 `cat file`。
- 遵循 POSIX 的 shell 支持 Here Document:

      $ cat << EOF
      one
      two
      three
      EOF

- Shell 管道默認在標準輸出 stdout 上操作。要在標準錯誤 stderr(3) 上輸出，可重定向 stderr 至 stdout：`command 2>&1 | othercommand`；或者，對於 Bash 4：`command |& othercommand`。
- 許多 GNU 核心工具接受文件作為參數。因此，例如 `grep pattern < file` 可替代為 `grep pattern file`。

## 參見

- Linux 中 Shell 的演變（英文）（位於 IBM developerWorks）
- terminal.sexy（英文）——終端配色方案設計器
- Hyperpolyglot（英文）——Shell 語法的並排比較
- UNIX Power Tools（英文）——一般命令行工具用法
- commandlinefu.com（英文）——命令行代碼片段分享
- 應用程式列表/工具#終端模擬器

分類：​

- 命令行解釋器
- 軟體列表

命令行解釋器
新增話題