我属于那种电脑启动后会立即打开终端窗口的人。现在这并非出于必要,而是一种习惯。我职业生涯的大部分时间都在学习终端的“魔法咒语”,并且我发现通过终端处理日常任务能让工作日更加愉快。话虽如此,偶尔尝试一些新事物也很不错。
最近,我放弃了默认的命令行解释器 Bash,转而使用 fish,它自豪地将自己标榜为“90 年代的命令行 shell”。这就是我切换的原因。

我发现 .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 开始,就能获得美观的体验。

在第一行中,命令是蓝色的,因为 pwd 是一个有效的命令。在第二行中,它是红色的,因为 pdw 不是一个有效的命令。我按下 Enter 键是为了表明这是真的,但我可以快速纠正错误并继续我的一天。在第三个命令中,我想将目录 (cd) 更改为我的 Development 文件夹,fish 会自动询问我是否要像上次一样跳转到我的 dotfiles 中。当我按两次 Tab 键时,它会显示同一目录中的其他选项,正如我所期望的那样。
如果我想自定义我的 fish shell 体验,我不需要安装任何额外的库或框架。Fish 自带 fish_config 命令,该命令会启动一个图形用户界面 (GUI),您可以在其中选择不同的颜色和提示符配置。

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

如果您调整您的配置,所有自定义项都存储在同一个位置:~/.config/fish。上面的屏幕截图显示我创建了一个自定义函数,使我可以轻松地使用 pyenv 激活 Python 环境。有关更多信息,请查看 关于 fish 函数的教程。
警告:fish 不像 Bash
在尝试其他 shell 时,我发现总有一些差异需要调整,但总体感觉很熟悉。fish 的情况并非如此。函数定义、别名和变量的工作方式都略有不同。有一些有用的策略可以将 .bashrc 和 .bash_profile 文件转换为 fish 配置,但这超出了本文的范围。因此,虽然我已经爱上了 fish,但我建议您参加交互式教程,看看您是否喜欢它。
尝试 fish,获得美观的默认 shell
我喜欢以打开终端开始我的一天,自从切换到 fish shell 后,我更加喜欢它了。它让我不再担心 Bash 中的内容,而是专注于我计划编写的代码。如果您希望不再摆弄终端,而更多地关注代码,请尝试一下。使用 chsh 将其设置为您的默认 shell,并在评论中告诉我效果如何。
8 条评论