放弃 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 是一个现代命令行界面,具有自动建议、制表符补全和语法高亮(以及其他功能)。我特别喜欢第一次尝试输入 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 命令,它看起来非常有用。

为了跟进这一点,终端模拟器通常是一个应用程序,例如:iTerm3、rxvt、Gnome Terminal 等。这些提供您的图形用户界面和渲染以及一些 UX 增强功能(查看 Terminology)。

这种措辞来自这样一个事实,即此功能过去来自像 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。

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