命令行 Shell
出自 Wikipedia
- Unix Shell 是一种命令行解释器或 Shell,为 Unix 操作系统和类 Unix 系统提供传统的用户界面。用户通过输入文本命令供命令行解释器执行,或通过创建包含一个或多个此类命令的文本脚本来指导计算机的运行。
Shell 列表
或多或少 POSIX 兼容 的 Shell 列在 #POSIX 兼容 下,而具有不同语法的 Shell 则列在 #替代 Shell 下。
POSIX 兼容
这些 Shell 都可以从 /usr/bin/sh
链接。当使用 sh
名称调用 Bash、mkshAUR 和 zsh 时,它们会自动变得更加 POSIX 兼容。
- Bash — Bash 扩展了 Bourne Shell,具有命令行历史记录和补全、索引和关联数组、整数算术、进程替换、here 字符串、正则表达式匹配和大括号展开等功能。
- Dash — Almquist SHell (ash) 的 NetBSD 版本的后代。一个快速的 POSIX 兼容 Shell,旨在尽可能小巧。
- KornShell (ksh) — KornShell 语言是一种完整、强大、高级的编程语言,用于编写应用程序,通常比其他高级语言更轻松快捷。这使其特别适合原型设计。ksh 具有 Bourne Shell 和 C Shell 的最佳功能,以及许多自身的新功能。因此,ksh 可以极大地提高您的生产力以及工作质量,无论是在与系统交互还是在编程方面。ksh 程序比用 C 等较低级语言编写的程序更易于编写,并且更简洁易读。
- nsh — 类似于 fish 的命令行 Shell,但 POSIX 兼容。
- Oil Shell (OSH) — Oil Shell 是一个 Bash 兼容的 UNIX 命令行 Shell。OSH 可以在大多数类 UNIX 操作系统上运行,包括 GNU/Linux。它用 Python (v2.7) 编写,但附带一个本机可执行文件。OSH 识别的 Bash 方言称为 OSH 语言。
- Yash — 另一个 Shell,是一个用 C99 (ISO/IEC 9899:1999) 编写的 POSIX 兼容命令行 Shell。Yash 旨在成为世界上最符合 POSIX 标准的 Shell,同时支持日常交互和脚本使用的功能。
- https://yash.osdn.jp || yashAUR
- Zsh — 专为交互使用而设计的 Shell,尽管它也是一种强大的脚本语言。Bash、ksh 和 tcsh 的许多有用功能都融入了 Zsh;还添加了许多原创功能。入门文档 详细介绍了 Zsh 的一些独特功能。
替代 Shell
- C Shell (tcsh) — 命令行语言解释器,既可用作交互式登录 Shell,也可用作 Shell 脚本命令处理器。它包括命令行编辑器、可编程单词补全、拼写校正、历史机制、作业控制和类似 C 的语法。
- Closh — 基于 Clojure 的类 Bash Shell。
- Elvish — Elvish 是一个现代且富有表现力的 Shell,可以通过管道传递内部结构化值。此功能使得可以避免大量复杂的文本处理代码。它具有富有表现力的编程语言,具有异常、命名空间和匿名函数等功能。它还具有强大的 readline,可在键入时检查语法,并默认进行语法突出显示。
- fish — 智能且用户友好的命令行 Shell。Fish 执行全彩命令行语法突出显示,以及命令及其参数、文件存在性和历史记录的突出显示和补全。它支持历史记录和命令的即时补全。Fish 能够解析系统的 man 手册,以确定命令的有效参数,从而可以突出显示和补全命令。可以使用
Alt+Up
完成轻松的上次命令修订。fish 守护进程 (fishd) 有助于跨所有 fish 实例同步历史记录,以及通用且持久的环境变量。此外,fish 还具有显着简化的编程语法和控制流(类似于 ruby)。有关更多信息,请参阅教程。
- ion — Ion 是一个现代系统 Shell,具有简单而强大的语法。它完全用 Rust 编写,这大大提高了 Shell 的整体质量和安全性,消除了类似 ShellShock 漏洞的可能性,并使开发更容易。当利用 Ion 的功能时,它还提供了超越 Dash 的性能水平。虽然它是与 RedoxOS 一起开发并主要用于 RedoxOS,但它在其他 *nix 平台上也完全胜任。有关更多详细信息,请查阅其手册。
- Murex — 一个具有改进功能和增强 UX 的命令行 Shell。
- https://murex.rocks/ || murexAUR
- nushell — Nu 从函数式编程语言和现代 CLI 工具中汲取灵感。Nu 不会将文件和服务视为原始文本流,而是将每个输入视为具有结构的事物。
- Oh — 用 Go 编写的 Unix Shell。它在精神上与其他 Unix Shell 相似,但在细节上有所不同。Oh 扩展了 Shell 的编程语言功能,而没有牺牲 Shell 的交互功能。
- PowerShell — PowerShell 是一种面向对象的编程语言和交互式命令行 Shell,最初为 Windows 编写并专用于 Windows。后来,它开源并移植到 macOS 和 Linux。
- rc — Plan 9 的命令解释器,提供类似于 UNIX 的 Bourne Shell 的功能,但有一些小的添加和不太古怪的语法。
- xonsh — Python 驱动的 Shell,具有您习惯于 Bash 和 IPython 的附加 Shell 原语。
更改默认 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/shell
是 chsh -l
给出的完整路径。
/usr/bin/bash
作为 Shell 路径。如果您现在注销并重新登录,您将看到另一个 Shell。
/etc/shells
作为参考。如果最近安装的 Shell 未在列表中,则可以手动将其添加到此文件。卸载 Shell
在删除 Shell 的软件包之前,更改默认 Shell。
或者,修改用户数据库。
将其用于每个用户,其登录 Shell 设置为 bash 以外的 Shell(包括 root,如果需要)。完成后,可以删除该软件包。
登录 Shell
登录 Shell 是一种调用模式,其中 Shell 读取用于一次性初始化的文件,例如系统范围的 /etc/profile
或用户的 ~/.profile
或其他特定于 Shell 的文件。这些文件设置初始环境,该环境由从 Shell 启动的所有其他进程(包括其他非登录 Shell 或图形程序)继承。因此,它们在会话开始时只读取一次,例如,当用户登录到控制台或通过 SSH、使用 sudo 或 su 并带有 --login
参数更改用户时,或者当用户手动调用登录 Shell 时(例如,通过 bash --login
)。
有关各种初始化文件的概述,请参见 #配置文件 及其中链接。有关登录 Shell 的更多信息,另请参见 Stack Exchange 上的 Login Shell 和 Non-Login Shell 之间的区别? 和 为什么选择 “login” shell 而不是 “non-login” shell?。
配置文件
要在控制台或登录时自动启动程序,您可以使用 shell 启动文件/目录。请阅读您的 shell 文档或 ArchWiki 文章,例如 Bash#配置文件 或 Zsh#启动/关闭文件。
另请参阅 维基百科:Unix shell#配置文件,以比较各种 shell 的各种配置文件。
/etc/profile
登录时,所有 Bourne 兼容的 shell 都会执行 /etc/profile
,而它又会执行 /etc/profile.d/
中任何可读的 *.sh
文件:这些脚本不需要解释器指令,也不需要是可执行文件。它们用于设置环境并定义特定于应用程序的设置。
标准化
可以使(某些)shell 配置文件遵循相同的命名约定,并在 shell 之间支持一些通用配置。
输入和输出
- 重定向会在命令执行前截断文件
$ command file > file
因此将无法按预期工作。虽然某些命令(例如 sed)提供了就地编辑文件的选项,但许多命令没有。在这种情况下,您可以使用 sponge(1) 命令,该命令来自 moreutils 软件包。 - 由于 cat 不是 shell 内置命令,在许多情况下,您可能会发现使用重定向更方便,例如在脚本中,或者如果您非常在意性能。实际上,
< file
的作用与cat file
相同。 - 符合 POSIX 标准的 shell 支持 Here Documents
$ cat << EOF one two three EOF
- Shell 管道 默认对 stdout 进行操作。要对 stderr(3) 进行操作,您可以使用
command 2>&1 | othercommand
或 Bash 4 的command |& othercommand
将 stderr 重定向到 stdout。 - 请记住,许多 GNU 核心实用程序 接受文件作为参数,因此例如
grep pattern < file
可以替换为grep pattern file
。
另请参阅
- Linux 中 shell 的演变,在 IBM developerWorks 上
- terminal.sexy — 终端配色方案设计器
- Hyperpolyglot — shell 语法的并排比较
- UNIX Power Tools — 通用命令行工具用法
- commandlinefu.com — 命令行代码片段分享
- 应用程序/实用程序列表#终端模拟器