我是那种电脑启动后会立即打开终端窗口的人之一。现在这并非出于必要,而是一种习惯。我职业生涯的大部分时间都在学习终端的魔法咒语,我发现通过终端进行日常任务能让工作日更加愉快。话虽如此,偶尔尝试一些新事物也不错。
我最近放弃了默认的命令行解释器 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 是一个现代命令行界面,具有自动建议、制表符补全和语法高亮(以及其他功能)。我特别喜欢第一次尝试输入 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 条评论