命令行解释器 - 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（英文）——命令行代码片段分享
- 应用程序列表/工具#终端模拟器

分类：​

- 命令行解释器
- 软件列表

命令行解释器
添加话题