虽然bash shell( https://oreil.ly/9GNyA )可能仍然是使用最广泛的shell,但它不一定是最人性化的。bash shell从20世纪80年代末就已经存在了,我强烈建议你评估并使用许多现代的、人性化的shell,而不是bash。
我们将首先详细地研究一个现代的、人性化的shell的具体例子,称为Fish shell,然后简要地讨论其他shell,只是为了确保你对选择的范围有一个概念。我们将在3.2.4节给出推荐和总结。
Fish shell( https://fishshell.com/ )将自己描述为一个智能且用户友好的命令行shell。让我们先看看一些基本用法,然后再转到配置主题。
对于许多日常任务,你不会注意到在输入方面与bash有很大区别。表3-2中的大部分命令是有效的。然而,fish与bash有两个不同之处,而且fish比bash方便得多:
没有明确的历史管理
你只需输入命令,就会显示之前执行过的命令。你可以使用上下键进行选择,如图3-4所示。
图3-4:Fish shell的历史管理命令
自动建议可用于许多命令
Fish shell的自动命令提示如图3-5所示。此外,当你按Tab键时,Fish shell将尝试完成命令、参数或路径,并给你可视化提示,例如,如果它不识别命令,则将你的输入涂成红色。
图3-5:Fish shell的自动命令提示
常用的fish命令如表3-3所示。在这种情况下,要特别注意环境变量的处理。
表3-3:Fish shell参考
与其他shell不同,fish将最后一个命令的退出状态存储在一个名为$status的变量中,而不是存储在$?中。
如果你从bash转为Fish,你可能还会用到Fish FAQ( https://oreil.ly/Nk2S2 ),它解决了大部分问题。
要配置Fish shell( https://oreil.ly/FCSne ),你只需输入fish_config命令(你可能需要添加browse子命令,这取决于你的发行版),fish将通过 http://localhost:8000 启动服务器,并自动打开默认浏览器,显示一个漂亮的UI,如图3-6所示,它允许你查看和更改设置。
图3-6:Fish shell配置界面
要在vi和Emacs(默认)键绑定之间进行切换,用于命令行导航,请使用fish_vi_key_bindings启动vi模式,并使用fish_default_key_bindings将其重置为Emacs。请注意,更改将立即在所有活动的shell会话中发生。
现在让我们看看如何配置环境。事实上,我的配置相当短,在 config.fish 中我有如下配置:
我的 fish_prompt.fish 中定义的提示是这样的:
上述提示定义产生如图3-7所示的提示。注意包含Git repo和不包含Git repo的目录之间的区别,这是一个内置的视觉提示,可以加快你的流程。另外,请注意右侧的当前时间。
图3-7:Fish shell提示
我的缩写——可以把它们看作alias的替代,就像在其他shell中发现的那样——如下所示:
要添加一个新的缩写,可以使用abbr --add。对于不带参数的简单命令,缩写很方便。如果你想要缩短一个更复杂的结构呢?假设你想要缩短涉及git的序列,该序列也接受一个参数。满足Fish中的函数。
现在让我们看一个示例函数,它定义在名为 c.fish 的文件中。我们可以使用functions命令列出所有已定义的函数,使用function命令创建一个新函数,在本例中使用function c命令编辑它,如下所示:
至此,我们浏览了Fish的使用教程和配置技巧。现在让我们快速了解一下其他现代shell。
Z-shell( https://oreil.ly/6y06N ),或zsh,是一个类Bourne shell,具有强大的补全( https://oreil.ly/bqS8y )系统和丰富的主题支持。使用Oh My Zsh( https://ohmyz.sh ),你几乎可以按照前面在fish中看到的方式配置和使用zsh,同时保持与bash的广泛向后兼容性。
zsh使用5个启动文件,如下例所示(注意,如果没有设置$ZDOTDIR,则zsh将使用$HOME):
❶作用于来自shell的所有调用。它包含设置搜索路径的命令,以及其他重要的环境变量。但是它不包含产生输出的命令,或者假设shell被附加到tty。
❷作为ksh粉丝的 .zlogin 的替代品(这两个不打算一起使用),类似于 .zlogin ,但它是在 .zshrc 之前被读取的。
❸在交互式shell中读取。它应该包含用于设置别名、函数、选项、键绑定等的命令。
❹来自登录shell。它应该包含只能在登录shell中执行的命令。请注意, .zlogin 不是用于别名定义、选项、环境变量设置等地方。
❺在登录shell退出时读取。
有关更多zsh插件,请参见GitHub上的awesome-zsh-plugins repo( https://oreil.ly/XHwBd )。如果你想学习zsh,可以考虑阅读Paul Falstad和Bas de Bakker的“An Introduction to the Z Shell”( https://oreil.ly/cMfnw )。
除了fish和zsh之外,还有许多其他有趣的shell(但不一定总是与bash兼容)可用。
当你看到这些时,请问问自己各shell的重点是什么(交互使用与脚本),以及围绕它的社区有多活跃。
我遇到了一些现代Linux shell的例子,可以推荐你看一下,包括:
Oil shell ( https://www.oilshell.org )
针对Python和JavaScript用户。换句话说,重点不是交互使用,而是脚本。
murex ( https://murex.rocks )
一个POSIX shell,具有一些有趣的特性,如集成测试框架、类型管道和事件驱动编程。
Nushell ( https://www.nushell.sh )
一个实验性的新shell范例,具有强大的查询语言的表格输出。你可以通过详细的Nu Book( https://oreil.ly/jIa5w )来了解更多信息。
PowerShell ( https://oreil.ly/bYKnd )
一种跨平台shell,最初是Windows PowerShell的一个分支,提供了一组与POSIX shell不同的语义和交互。
还有更多的选择。请继续寻找,看看什么最适合你。试着跳出bash思考,并针对你的用例进行优化。
现在,从以人为中心的角度来看,每个现代shell(除了bash)似乎都是不错的选择。在2022年,流畅的自动完成、简单的配置和智能环境都不是奢侈品,考虑到你通常在命令行上花费的时间,你应该尝试不同的shell,并选择你最喜欢的一个。我个人使用Fish shell,但我的许多同行都非常满意Z-shell。
你可能会遇到一些问题,使你犹豫是否要放弃bash,例如,以下问题:
·你在远程系统中工作或不能安装自己的shell。
·你一直使用bash是因为兼容性或肌肉记忆。有些习惯很难改掉。
·几乎所有指令都(隐式地)假定bash。例如,你将看到类似export FOO=BAR的指令,这是特定于bash的。
事实证明,这些问题基本上与大多数用户无关。虽然你可能不得不暂时在远程系统中使用bash,但大多数时候你将在自己控制的环境中工作。虽然有一个学习曲线,但从长远来看,投资是有回报的。
接下来,让我们关注另一种提高终端工作效率的方法:多路复用器。