我最喜欢的 CLI 工具
之前,我写过我最喜欢的 Mac 应用。但我一半的时间都花在了终端上,而且我有一些 CLI 工具可以让我的生活更轻松。以下是其中一些:
我每天使用的工具
鱼壳
Shell——每次打开终端时都会用到的最重要的工具。我以前用过 Bash 和 Z Shell,现在用的是 Fish Shell。它是一款非常棒的 Shell,有很多开箱即用的功能,比如自动建议、语法高亮,以及用 ⌥+→ 和 ⌥+← 在文件夹之间切换。
一方面,这使其非常适合初学者,因为您无需进行任何设置。另一方面,由于它使用的语法与其他 Shell 不同,您通常无法直接粘贴来自互联网的脚本。您要么必须将不兼容的命令更改为Fish 脚本,要么启动 Bash 会话来运行 Bash 脚本。我理解这种改变背后的想法(Bash 并非最易用的语言),但它对我没有任何好处。我很少编写 Bash/Fish 脚本,以至于无法记住语法,因此我总是不得不从头开始重新学习。而且,Fish 脚本的资源比 Bash 脚本少。我通常会阅读文档,而不是从 StackOverflow 复制粘贴现成的脚本。
我推荐 Fish 吗?当然!切换 Shell 很容易,所以试试吧。尤其如果你不喜欢摆弄 Shell,又想用最少的配置就能用得很好。
鱼插件
你可以使用插件为 fish 添加更多功能。最简单的安装方法是使用插件管理器,例如Fisher、Oh My Fish或fundle。
现在,我仅使用 Fisher 的三个插件:
- franciscolourenco/done - 在长时间运行的脚本完成时发送通知。我并没有一直打开终端。我使用的是Guake 风格的终端,需要时它会从屏幕顶部下拉,不需要时它会隐藏。有了这个插件,当我运行耗时超过几秒钟的脚本时,我会在脚本完成时收到 macOS 通知。
- evanlucas/fish-kubectl-completions - 为 kubectl(Kubernetes 命令行工具)提供自动完成功能。
- fzf - 将 fzf 工具(见下文)与 fish 集成。
我过去有更多的插件(rbenv、pyenv、nodenv、fzf、z),但我切换到不同的工具以避免减慢我的 shell 速度(这是我过去使用 Z shell 时犯的一个错误)。
如果您想查看更多关于 fish 的资源,请查看awesome-fish仓库。与 Z shell 和 Bash 相比,fish 的插件较少,因此如果您想对其进行大量调整,它并非最佳选择。但对我来说,这反而是个优点。它避免了我启用太多插件然后抱怨它太慢 😉。
星舰
如果要我从这份清单中选出一个我最喜欢的工具,那一定是 Starship。Starship 是一个适用于任何 Shell 的提示符。你安装它,在.bashrc
/ .zshrc
/中添加一行配置config.fish
,剩下的就交给它了。
它显示:
- 当前目录的 git 状态和不同的符号,取决于您是否有新文件、待处理的更改、存储等。
- 如果您在 Python 项目文件夹中,则为 Python 版本(同样适用于 Go/Node/Rust/Elm 和许多其他编程语言)
- 前一个命令执行的时间(如果超过几毫秒)
- 如果最后一个命令失败,则显示错误指示

还有海量其他信息。而且,以一种巧妙的方式!如果您不在 git 仓库中,它会隐藏 git 信息。如果您不在 Python 项目中,则不会显示 Python 版本(因为显示它毫无意义)。它不会让您被过多的信息淹没,并且提示符保持美观、实用和简约。
我有没有说过它很快?它是用 Rust 编写的,即使功能如此丰富,它仍然比我之前的所有提示符都快!我对提示符非常挑剔,所以我经常会修改自己的版本。我会从现有的提示符中取出函数,然后将它们粘合在一起,以确保只包含我需要的功能,并且保持快速运行。这就是我之前对 Starship 持怀疑态度的原因。“外部工具不可能比我精心设计的提示符更快! ” 好吧,我错了。试试看,我相信你一定会爱上它!向 Starship 的创造者致以崇高的敬意!
z
“z” 键可让您在文件系统中快速跳转。它会记住您访问过的文件夹,经过短暂的学习后,您就可以使用 在这些文件夹之间移动z path_of_the_folder_name
。
例如,如果我经常访问某个文件夹~/work/src/projects
,我可以直接运行z pro
并立即跳转到那里。z 的算法基于频率——频率和新近度的结合,效果非常好。如果它记住了你不想使用的文件夹,你可以随时手动将其删除。
它加快了在我的计算机上经常访问的文件夹之间的移动,并为我节省了大量的击键(和路径记忆)。
零点
fzf 是“模糊查找器”的缩写。它是一个通用工具,可让您使用模糊搜索查找文件、历史记录中的命令、进程、git 提交等。您输入一些字母,它会尝试在结果列表中的任何位置匹配这些字母。输入的字母越多,结果就越准确。您可能在代码编辑器中熟悉这种搜索类型——当您使用命令打开文件时,只输入文件名的一部分而不是完整路径——这就是模糊搜索。
我通过fish fzf 插件使用它,这样我就可以搜索命令历史记录或快速打开文件。这是另一个每天节省我时间的小工具。
FD

与命令类似find
,但使用起来更简单、更快,并且具有良好的默认设置。
您想查找一个名为“invoice”的文件,但不确定它的扩展名是什么?或者,它可能是一个包含所有发票的目录,而不是单个文件?您可以撸起袖子,开始为命令编写那些正则表达式find
,或者直接运行fd invoice
。对我来说,选择很简单😉。
默认情况下,fd 会忽略隐藏的或在 中列出的文件和目录.gitignore
。大多数情况下 - 这就是你想要的,但对于需要禁用此功能的少数情况,我有一个别名:fda='fd -IH'
。
输出色彩很好,并且根据基准(或上面的 GIF),它甚至比 还要快find
。
ripgrep

与上面提到的类似fd
,ripgrep
这是该命令的替代方法grep
- 速度更快,具有合理的默认值和彩色输出。
它会跳过被忽略的文件.gitignore
和隐藏的文件,因此您可能需要这个别名:rga='rg -uuu'
。它会禁用所有智能过滤并使其ripgrep
行为与标准 grep 相同。
htop和glances
在 Linux 或 Mac 上显示进程信息的最常用工具是top
。它是每个系统管理员的好帮手。而且,即使你像我一样主要从事 Web 开发,查看计算机的运行情况也很有用。你知道,看看这次是不是 Docker 或 Chrome 占用了你所有的内存。

top
非常基础,因此大多数人都转而使用htop。htop
它是类固醇中的佼佼者 - 色彩丰富,选项丰富,总体来说使用起来更舒适。

glances是 的补充工具htop
。除了列出所有进程及其 CPU 和内存使用情况外,它还会显示有关系统的其他信息。
您可以看到:
- 网络或磁盘使用情况
- 文件系统上的已用空间和总空间
- 来自不同传感器的数据(例如电池)
- 以及最近消耗过多资源的进程列表
我仍然使用它htop
来更快地过滤和终止进程,但我用它glances
来快速查看电脑的运行情况。它配备了 API、Web UI 和各种导出格式,因此您可以将系统监控提升到一个新的水平。我强烈推荐它!
virtualenv和virtualfish
Virtualenv 是 Python 中创建虚拟环境的工具(我比内置venv
模块更喜欢它)。
VirtualFish 是 fish shell 的虚拟环境管理器(如果您不使用 fish,请查看virtualenvwrapper)。它提供了一系列额外的命令来快速创建、列出或删除虚拟环境。
pyenv、nodenv和rbenv

Pyenv、nodenv 和 rubyenv 是用于管理我的计算机上不同版本的 Python、Node 和 Ruby 的工具。
假设您想在计算机上安装两个版本的 Python。也许您正在开发两个不同的项目,或者您仍然需要支持 Python 2。管理不同的 Python 版本非常困难。您需要确保不同的项目安装的软件包版本正确。如果不小心,很容易弄乱这个脆弱的设置,并覆盖其他软件包使用的二进制文件。
版本管理器帮了大忙,把这个噩梦变成了一件相当容易处理的事情。好的版本管理器可以全局或“按文件夹”切换 Python 版本。而且每个版本都是相互隔离的。
我最近发现了一个名为asdf的工具,它可以用一个工具取代 pyenv、nodenv、rbenv 和其他 *env,从而控制所有环境。它为几乎所有编程语言提供版本管理,下次我需要为编程语言设置版本管理器时,我一定会尝试一下。
pipx
Virtualenv 解决了 Python 包管理的诸多问题,但还有一个用例需要介绍。如果我想全局安装一个 Python 包(因为它是一个独立的工具,正如glances
前面提到的),我会遇到一个问题。在虚拟环境之外安装包是个坏主意,并且可能会导致将来出现问题。另一方面,如果我决定使用虚拟环境,那么每次运行我的工具时都需要激活该虚拟环境。这也不是最方便的解决方案。
事实证明,该pipx
工具可以解决这个问题。它将 Python 包安装到单独的环境中(因此不存在依赖项冲突的风险)。同时,这些工具提供的 CLI 命令可全局使用。因此,我无需激活任何东西——它pipx
会帮我搞定一切!
ctop和lazydocker

当你使用 Docker 时,这两个工具都很有用。ctop
是一个类似 Top 的 Docker 容器界面。它为你提供:
- 正在运行和已停止的容器列表
- 内存使用情况、CPU 等统计信息以及每个容器的附加详细窗口(包含开放端口和其他信息)
- 用于停止、终止或显示给定容器的日志的快捷菜单
这比尝试从中找出所有这些信息要好得多docker ps
。

如果你觉得这ctop
很酷,那就赶紧试试吧lazydocker
!它是一个功能齐全的 Docker 终端 UI,拥有更多功能。说到 Docker,我最喜欢的工具就是它了!
我并不每天使用的工具
除了我几乎每天都会用到的工具外,还有一些我多年来收集的工具,我发现它们在某些特定任务上特别有用。比如可以从终端录制 GIF(你可以暂停并复制文本!)、列出目录结构、连接数据库等等。
自制
如果您使用 Mac,Homebrew 无需介绍。它是macOS 上事实上的软件包管理器。它甚至还有一个名为Cakebrew 的GUI 版本。
海胆属
asciinema
是一款可用于录制终端会话的工具。不过,与录制 GIF 不同的是,它允许查看者从录制内容中选择并复制代码!
它对于录制编码教程有很大帮助——没有什么比输入长命令更令人沮丧的了,因为讲师没有为您提供代码片段。
colordiff和diff-so-fancy

我很少再在终端中执行 diff(比较两个文件之间的差异),但如果您需要执行此操作,请使用colordiff
而不是不可用的diff
命令。colordiff
对输出进行着色,因此更容易看到更改,而不必尝试遵循所有“<”和“>”符号。

对于运行git diff
和git show
命令,有一个更好的工具叫做diff-so-fancy。它通过以下方式进一步改善了 diff 的外观:
- 突出显示改变的单词(而不是整行)
- 简化已更改文件的标题
- 去掉 + 和 - 符号(你已经有颜色了)
- 清楚地指示新的和删除的空行
树 (brew install tree
)
如果你想展示指定目录的内容,tree
有一个好用的工具可以做到。它以漂亮的树状结构显示所有子目录和文件:
$ tree .
.
├── recovery.md
├── README.md
├── archive
├── automator
│ ├── Open\ Iterm2.workflow
│ │ └── Contents
│ │ ├── Info.plist
│ │ ├── QuickLook
│ │ │ └── Thumbnail.png
│ │ └── document.wflow
│ └── Start\ Screen\ Saver.workflow
├── brew-cask.sh
蝙蝠
类似cat
(最常用于在终端中显示文件内容的命令)但更好。
添加语法突出显示、git 装订线标记(适用时)、自动分页(如果文件很大),并且总体上使输出更易于阅读。
httpie

如果您需要发送一些 HTTP 请求并且发现curl
使用起来不直观,请尝试httpie
。
这是一个很好的替代方案。它使用起来更方便,具有合理的默认值和简单的语法,返回彩色输出,甚至支持安装其他插件(用于不同类型的身份验证)。
tldr
简化的手册页。“手册页”包含 Linux 软件的手册,用于解释如何使用给定的命令。尝试运行man cat
或man grep
查看示例。它们非常详细,有时可能难以理解。因此,tldr
社区致力于将每个手册页的精髓提炼成简短的描述,并附带一些示例。
tldr
适用于最流行的软件。正如我所说,这是一个社区的努力,有人会为你记录一个鲜为人知的软件包的可能性很小。但如果它有效,它提供的信息通常包含你正在寻找的内容。
例如,如果您想创建几个文件的 gzip 压缩档案,man tar
那么您将会被各种可能的选项所淹没。tldr tar
相反,我们会列出一些常见的例子 - 第二个例子正是您想要做的事情:

埃克萨
exa
可以替代该ls
命令。
它色彩丰富,显示诸如 git 状态之类的附加信息,自动将文件大小转换为人类可读的单位,并且保持与 相同的速度ls
。
虽然我喜欢它,也推荐它,但不知为何,我还是坚持用ls
它。大概是肌肉记忆吧?
litecli和pgcli
我常用的 SQLite 和 PostgreSQL CLI 解决方案。它们具备自动补全和语法高亮功能,比默认工具好用sqlite3
得多psql
。
马斯
mas
是一个用于从 App Store 安装软件的 CLI 工具。我这辈子用过一次——当时我正在设置我的 Macbook。我也会用它来设置我的下一台 Macbook。
mas
让你在 macOS 中自动安装软件。它可以帮你省去大量的点击操作。而且,既然你正在阅读一篇关于 CLI 工具的文章,我猜你和我一样,不喜欢点击。
我在“灾难恢复”脚本中保存了从 App Store 安装的应用列表。如果发生意外,我希望能够以最小的麻烦重新安装所有应用。
国家教育和研究发展局
终端磁盘使用情况分析器。快速易用。当我需要释放一些空间时,它就是我的默认工具(“哦,我确定 256GB 的磁盘空间足够了!”)。
就这些了
这是一个很长的清单,但希望你今天能发现一些新的东西。
有些工具,例如fd
、ripgrep
或 ,httpie
是您可能已经了解的工具的改进版本。新版本不仅更易于使用,输出效果更佳,有时甚至速度更快。所以,不要仅仅因为其他人都在使用旧工具就固执地使用它们。
我听到的一个坚持使用“标准 Linux 工具”的常见论点是:
但是,如果你需要登录 Linux 服务器并在那里进行一些工作,该怎么办?你将无法使用那些常用的工具。最好学习如何使用大多数 Linux 发行版内置的工具。
你上次登录 Linux 服务器是什么时候?是那种你无法安装软件,却不得不手动调试问题的服务器吗?我甚至都不记得了。现在很少有人这样做了。也许是时候重新思考你的部署方式,从手动操作转向更具可扩展性的方式了?
不要让您的工具带生锈,并在那里添加一些新的 CLI 工具!
我提到的许多工具都与 Python 编程相关。如果您想了解更多信息并了解我的使用方法,我为 PyCon 2020 大会制作了一个免费视频,名为“现代 Python 开发者工具包”。
这是一个两小时的教程,讲解如何搭建 Python 开发环境、使用哪些工具,以及如何从零开始创建一个 TODO 应用程序(包含测试和文档)。你可以在 YouTube 上观看。
文章来源:https://dev.to/switowski/my-favorite-cli-tools-4p4g