跳转至内容

命令行 shell

来自 ArchWiki
(重定向自 Ksh)

来自 Wikipedia

Unix Shell 是一个命令行解释器或 Shell,它为 Unix 操作系统和类 Unix 系统提供了传统的用户界面。用户通过输入文本命令供命令行解释器执行,或通过创建包含一个或多个此类命令的文本脚本来指导计算机的操作。

Shell 列表

更多或更少 符合 POSIX 标准的 Shell 列在 #符合 POSIX 标准的 Shell 下方,而语法不同的 Shell 列在 #其他 Shell 下方。

符合 POSIX 标准的 Shell

所有这些 Shell 都可以从 /usr/bin/sh 链接。当 BashmkshAURzshsh 名称调用时,它们会自动变得更符合 POSIX 标准。

  • Bash — Bash 通过命令行历史记录和补全、索引和关联数组、整数算术、进程替换、here string、正则表达式匹配和花括号展开来扩展 Bourne Shell。
https://gnu.ac.cn/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,是一个用 C99 (ISO/IEC 9899:1999) 编写的符合 POSIX 标准的命令行 Shell。Yash 旨在成为世界上最符合 POSIX 标准的 Shell,同时支持日常交互和脚本使用的功能。
https://magicant.github.io/yash/ || yashAUR
  • Zsh — 为交互式使用而设计的 Shell,尽管它也是一个强大的脚本语言。Zsh 整合了 Bash、ksh 和 tcsh 的许多有用功能,并添加了许多原创功能。 介绍性文档详细介绍了 Zsh 的一些独特功能。
https://www.zsh.org/ || zsh
提示 POSIX 和 Bash 脚本可以使用 shellcheck 进行代码检查。

替代 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,可以将内部结构化值通过管道传递。此功能可以避免大量复杂的文本处理代码。它具有富有表现力的编程语言,具有异常处理、命名空间和匿名函数等功能。它还具有强大的 readline 功能,可以在键入时检查语法,并默认启用语法高亮。
https://elv.sh || elvish
  • fish — 智能且用户友好的命令行 Shell。Fish 执行全彩命令行语法高亮,以及命令及其参数、文件存在性和历史记录的高亮和补全。它支持即时补全历史记录和命令。Fish 能够解析系统手册页以确定命令的有效参数,从而能够高亮显示和补全命令。可以使用 Alt+Up 轻松修订上一条命令。此外,Fish 具有显著简化的编程语法和控制流(类似于 Ruby)。有关更多信息,请参阅 教程
https://fishshell.com/ || fish
  • ion — Ion 是一个现代系统 Shell,具有简洁而强大的语法。它完全用 Rust 编写,这极大地提高了 Shell 的整体质量和安全性,消除了 ShellShock 类漏洞的可能性,并简化了开发。它还提供了在利用 Ion 的功能时超越 Dash 性能的水平。虽然它与 RedoxOS 一起开发,并主要为 RedoxOS 开发,但它在其他 *nix 平台上功能齐全。有关更多详细信息,请查看其 手册
https://gitlab.redox-os.org/redox-os/ion/ || ion-gitAUR
  • Murex — 一个具有改进功能和增强用户体验的命令行 Shell。
https://murex.rocks/ || murexAUR
  • nushell — Nu 从函数式编程语言和现代 CLI 工具中汲取灵感。Nu 不将文件和服务视为纯文本流,而是将每个输入视为具有结构的对象。
https://www.nushell.sh || nushell
  • Oh — 用 Go 编写的 Unix Shell。在精神上与其他 Unix Shell 相似,但在细节上有所不同。Oh 在不牺牲 Shell 的交互式功能的情况下扩展了 Shell 的编程语言功能。
https://github.com/michaelmacinnis/oh || oh-gitAUR
  • PowerShell — PowerShell 是一种面向对象的编程语言和交互式命令行 Shell,最初为 Windows 编写并独占。后来,它被开源并移植到 macOS 和 Linux。
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,则需要更改默认 Shell。

要列出所有已安装的 Shell,请运行

$ chsh -l

要将其设置为您的用户默认 Shell,请执行

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

如果您正在使用 systemd-homed,请运行

$ homectl update --shell=/full/path/to/shell user

其中 /full/path/to/shellchsh -l 提供的完整路径。

注意 新用户的默认 Shell 是 Bash。要切换回它,请在上述命令中使用 /usr/bin/bash 作为 Shell 路径。

如果您现在注销并重新登录,您将看到已更改的 Shell。

提示 chsh 使用 /etc/shells 作为参考。如果最近安装的 Shell 不在该列表中,可以手动将其添加到此文件中。

卸载 Shell

警告 未能遵循以下步骤可能会导致用户无法访问可用的 Shell。

在删除 Shell 的软件包之前,请 更改默认 Shell

或者,修改 用户数据库

对于每个将非 bash 设置为登录 Shell 的用户(包括 root,如果需要),请使用此方法。完成后,可以删除该软件包。

登录 shell

登录 Shell 是一种调用模式,在这种模式下,Shell 会读取用于一次性初始化的文件,例如系统范围的 /etc/profile 或用户的 ~/.profile 或其他特定于 Shell 的文件。这些文件设置了初始环境,该环境会被从 Shell 启动的所有其他进程(包括其他非登录 Shell 或图形程序)继承。因此,它们只在会话开始时读取一次,例如,当用户登录到控制台或通过 SSH 登录时,使用 --login 参数通过 sudosu 更改用户时,或者当用户手动调用登录 Shell 时(例如,通过 bash --login)。

有关各种初始化文件的概述,请参阅 #配置文件 及其中的链接。有关登录 Shell 的更多信息,另请参阅 Stack Exchange 上的 登录 Shell 和非登录 Shell 之间的区别?为什么使用“登录”Shell 而非“非登录”Shell?

配置文件

要在控制台或登录时自动启动程序,可以使用 Shell 启动文件/目录。阅读您的 Shell 的文档,或其 ArchWiki 文章,例如 Bash#配置文件Zsh#启动/关闭文件

有关各种 Shell 的配置文件比较,请参阅 Wikipedia:Unix shell#配置文件

/etc/profile

登录时,所有与 Bourne Shell 兼容的 Shell 都会 source /etc/profile,后者又会 source /etc/profile.d/ 中任何可读的 *.sh 文件:这些脚本不需要解释器指令,也不需要是可执行的。它们用于设置环境并定义应用程序特定的设置。

标准化

可以使(部分)Shell 的配置文件遵循相同的命名约定,并支持 Shell 之间的一些通用配置。

请参阅 有关此内容的文章相关存储库。另请参阅 xsh

输入和输出

另请参阅 GregsWikiI/O 重定向

  • 重定向会在命令执行前截断文件
    $ command file > file
    因此将无法按预期工作。虽然有些命令(例如 sed)提供就地编辑文件的选项,但许多命令则没有。在这种情况下,您可以使用 sponge(1) 命令,该命令来自 moreutils 软件包。
  • 由于 cat 不是 Shell 的内置命令,因此在许多情况下,您可能会发现使用 重定向更方便,例如在脚本中,或者如果您非常关注性能。实际上 < filecat file 的作用相同。
  • 符合 POSIX 标准的 Shell 支持 Here Documents
    $ cat << EOF
    one
    two
    three
    EOF
    
  • Shell 管道默认操作 stdout。要操作 stderr(3),您可以通过 command 2>&1 | othercommandstderr 重定向到 stdout,或者对于 Bash 4,可以使用 command |& othercommand
  • 请记住,许多 GNU 核心工具接受文件作为参数,因此例如 grep pattern < file 可以被 grep pattern file 替换。

参见