放弃 Bash,选择 fish shell,获得美观的默认设置

以 fish 为主题的“友好的交互式 shell”在命令行上创造了更愉悦的体验。
148 位读者喜欢这篇文章。
Jump-start your career with open source skills

Opensource.com

我属于那种电脑启动后会立即打开终端窗口的人。现在这并非出于必要,而是一种习惯。我职业生涯的大部分时间都在学习终端的“魔法咒语”,并且我发现通过终端处理日常任务能让工作日更加愉快。话虽如此,偶尔尝试一些新事物也很不错。

最近,我放弃了默认的命令行解释器 Bash,转而使用 fish,它自豪地将自己标榜为“90 年代的命令行 shell”。这就是我切换的原因。

fish shell website

我发现 .bashrc 已经不够用了

大约一年前,我决定停止抽象化我的操作系统,开始从头学习它。最近,我从 Mac 切换到 Linux,这让我有理由研究将我的 dotfiles 移植到新环境。这令人耳目一新;我发现了很多令人困惑的快捷方式和重复项,并将它们精简为可以在操作系统之间良好移植的东西。以下是一些我最喜欢的。

## Nicer shell experience
export GREP_OPTIONS="--color=auto"; # make grep colorful
export LSCOLORS=gxfxbEaEBxxEhEhBaDaCaD; # make ls more colorful as well
export HISTSIZE=32768; # Larger bash history (allow 32³ entries; default is 500)
export HISTFILESIZE=$HISTSIZE;
export HISTCONTROL=ignoredups; # Remove duplicates from history. I use `git status` a lot.
export HISTIGNORE="ls:cd:cd -:pwd:exit:date:* --help"; # Make some commands not show up in history
export LANG="en_US.UTF-8"; # Language formatting is still important
export LC_ALL="en_US.UTF-8"; # byte-wise sorting and force language for those pesky apps
export MANPAGER="less -X"; # Less is more 
export GPG_TTY=$(tty); # for gpg key management

我一直在努力揭开我的环境的神秘面纱,它开始变得更有意义了。

自定义破坏了我的 .bashrc

正是在这种清晰的时候,我又遇到了麻烦。我希望我的终端中拥有一些现代约定,特别是自动建议、语法高亮和命令输出的着色,而不需要太多的依赖项,并且我希望这种配置独立于我正在运行的任何命令行解释器。(iTerm2 在 Mac 上很棒,但我不希望在我的 dotfiles 中跟踪其神秘的配置文件。)那么我该怎么办呢?

第一次寻找答案时,我一步一步地解决了它

  • 首先,我自定义了我的 ~/.inputrc 文件,以允许向前和向后搜索。
  • 然后,我用 ccat 的美化输出替换了 cat,并在我的 .bashrc 中将 cat 别名为 ccat。但这后来最终在某些情况下破坏了写入 stdout 的操作,所以我停止使用它了。
  • 最终,我使用了 Bash-it,这是一个用于自定义 Bash 的强大插件系统。

在一步一步地剥开各个部分之后,我感觉我对我的系统如何运行有了更多的了解。为了获得我所追求的现代体验,我感觉不得不经历的繁琐步骤让我回到了将我带到这一点的标准。我感觉自己像是历史的囚徒,直到我决定抛弃一切,尝试完全不同的东西。

使用 fish shell 的简易默认设置和自定义

Fish shell 是一个现代化的命令行界面,具有自动建议、Tab 补全和语法高亮(以及其他功能)。我特别喜欢从你第一次尝试输入 fish 开始,就能获得美观的体验。

An example of the fish shell with Solarized Light theme

在第一行中,命令是蓝色的,因为 pwd 是一个有效的命令。在第二行中,它是红色的,因为 pdw 不是一个有效的命令。我按下 Enter 键是为了表明这是真的,但我可以快速纠正错误并继续我的一天。在第三个命令中,我想将目录 (cd) 更改为我的 Development 文件夹,fish 会自动询问我是否要像上次一样跳转到我的 dotfiles 中。当我按两次 Tab 键时,它会显示同一目录中的其他选项,正如我所期望的那样。

如果我想自定义我的 fish shell 体验,我不需要安装任何额外的库或框架。Fish 自带 fish_config 命令,该命令会启动一个图形用户界面 (GUI),您可以在其中选择不同的颜色和提示符配置。

fish shell's colors

更令人印象深刻的是,您还可以从 GUI 中查看所有可用的函数、变量、绑定等等。

fish functions

如果您调整您的配置,所有自定义项都存储在同一个位置:~/.config/fish。上面的屏幕截图显示我创建了一个自定义函数,使我可以轻松地使用 pyenv 激活 Python 环境。有关更多信息,请查看 关于 fish 函数的教程

警告:fish 不像 Bash

在尝试其他 shell 时,我发现总有一些差异需要调整,但总体感觉很熟悉。fish 的情况并非如此。函数定义、别名和变量的工作方式都略有不同。有一些有用的策略可以将 .bashrc 和 .bash_profile 文件转换为 fish 配置,但这超出了本文的范围。因此,虽然我已经爱上了 fish,但我建议您参加交互式教程,看看您是否喜欢它。

尝试 fish,获得美观的默认 shell

我喜欢以打开终端开始我的一天,自从切换到 fish shell 后,我更加喜欢它了。它让我不再担心 Bash 中的内容,而是专注于我计划编写的代码。如果您希望不再摆弄终端,而更多地关注代码,请尝试一下。使用 chsh 将其设置为您的默认 shell,并在评论中告诉我效果如何。

接下来阅读
标签
I'm happiest at a microphone
Matt 曾经是 EMC 存储专家、VMware vExpert,以及其他专有技术的爱好者。他现在专注于开源和 DevRel 推广。

8 条评论

“我最近放弃了默认的终端模拟器 Bash”

Bash 和 Fish 不是终端模拟器,它们是命令语言解释器(如手册页中所述)。除此之外,文章写得不错。我以前不知道 fish_config 命令,它看起来非常有用。

哎呀,我一直交替使用终端模拟器这个词。谢谢您(友善地)指出这一点。

另外,对于其他对术语感到困惑的人来说,这是一篇很棒的文章:http://www.linusakesson.net/programming/tty/

回复 “我最近放弃了...” ,ersen

为了进一步说明,终端模拟器通常是一个应用程序,例如:iTerm3、rxvt、Gnome Terminal 等。这些提供您的图形 UI 和渲染以及一些 UX 增强功能(请查看术语表)。

这种措辞源于这样一个事实:此功能过去来自物理终端,例如 DEC VT500。您可能会注意到“VT100 兼容性”仍然在一些地方列出,因为它是一个逻辑后备方案,以确保即使在现在基本功能仍然可用。

回复 “哎呀,我一直使用终端...”,mbbroberg

保持真实,保持简单,安全至上。
我喜欢 bash。

我也使用 bash,但是将您的 shell 更改为 fish 可能会产生意想不到的副作用。例如,/etc/profile{,.d} 不会自动被 sourcing,并且无法通过 fish 进行 sourcing。

我和其他人从 archlinux wiki 中使用的一个技巧是让 bash 作为主 shell,并在会话交互时初始化 fish

if [[ $(ps --no-header --pid=$PPID --format=cmd) != "fish" ]]
then
exec fish
fi

试试 zsh。100% bash 兼容,拥有 fish 的所有功能,而且速度更快。将其与 Powerlevel10k 结合使用,您将获得一个闪电般快速、功能强大、美观的提示符。而且 MacOS 现在使用 zsh 作为其默认 shell。虽然我不使用 Mac,呃。

Fish 很有趣。但对我来说改变太大了。我还是坚持使用 Bash,谢谢!

我总是乐于探索和学习新事物。事实上,当我看到类似这样的东西时,我大部分时间都在跑题到新的领域。
话虽如此,就像回到家一样,我总是会回到好用的 bash。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.