面向开发人员的命令行工具

已发表: 2022-03-11

在当今的在线世界中,吸引用户的战斗仍在继续,应用程序制造商更喜欢移动应用程序或网络应用程序。 桌面应用程序变得越来越不重要。 此外,它们也往往只是 Web 应用程序的富客户端——Electron 是流行的首选平台。

这是否意味着我们将很快放弃桌面作为平台? 不,当然不是,我不会这么说。 此外,虽然 GUI 应用程序最近似乎一直停滞不前,但有一部分桌面应用程序仍在继续增长。

你看过任何以黑客为主角的电影吗? 通常情况下,这些人在显示某种终端的显示器前工作(通常具有深色背景和浅色前景)。 反过来,这个终端往往会充斥着经过的角色,这些角色显然对观看它们的人有一定的意义。

插图:命令行工具和黑客在电影中看起来比在现实生活中更酷

黑客在行动中的这种表现经常被专业开发者嘲笑,甚至有一些程序模拟各种“黑客”效果,只是为了好玩。

然而,在现实世界中,命令行工具并没有用于娱乐价值。

为什么我们仍然使用命令行界面工具

本文重点介绍使用命令行界面 (CLI) 工具的实用方面。 了解 CLI 命令和使用质量工具可以提高您的工作效率,还可以为各种自动化方法打开大门,这些方法对于文本界面比使用 GUI 应用程序更实用。

您可以更好地在 GUI 中执行重复性任务,以至于您的多次点击被视为一次长点击。 问题是,这仍然比不上专门脚本的效率。 更重要的是,手动执行相同的操作会增加认知负担和增加人为错误的可能性。 像往常一样,我们依靠计算机来处理人类可能会觉得无聊、重复或不堪重负的任务。

值得知道的是,终端工具可以提供多种类型的接口。 有像 ls 这样的非交互式的,它只是接受参数并提供输出。 在包管理器中最常见的是交互式或半交互式界面。 (“您确定要从未经验证的来源继续安装吗?”)然后,有文本用户界面 (TUI),它们是交互式 GUI 应用程序,旨在适应终端的限制。 最著名的可能是午夜指挥官 (mc),它是极受欢迎的(90 年代)诺顿指挥官的克隆。

基本命令行工具

如果你想成为一名控制台居民,你需要为自己配备一套最低限度的命令行开发工具——最基本的。 您绝对不能没有的东西是交互式外壳(旨在通过方便的制表符完成现代的东西)和文本编辑器

插图:必不可少的命令行工具

现在,我将提到UNIX 哲学,它通常是该工具的作者做出的设计决策背后的基础,无论是否有意识。 一些关键点可以总结如下:

  • 将所有内容视为文件。
  • 只做一件事,但要把它做好。
  • 从标准输入读取,写入标准输出,并将错误传达给标准错误流。
  • 成功时,返回代码 0。非零值表示错误(可以通过确切的返回代码指定)。
  • 允许命令链接和脚本。

贝壳

打开终端时首先看到的是外壳。 这是使用户和机器之间的交互成为可能的部分。 它解释您的命令,将它们拆分为程序名称和参数,并执行您向其发送的所有 shell 命令。

从历史上看,有许多不同种类的贝壳。 其中最流行的是csh (C Shell) 和 Bourne Shell 的各种实现(通常简称为sh )。 Bourne Shell 扩展到 Korn Shell,这也获得了一些牵引力,并且仍然被其爱好者使用。 Csh 目前是某些 BSD 系统上的默认 shell,而几乎所有其他类 UNIX 操作系统都更喜欢某种 Bourne Shell。 Linux 发行版倾向于使用 bash,而 Mac OS X 将 zsh 作为默认选择。

除了 Windows 系统上的 Microsoft PowerShell,还有其他可能性,但它们远没有那么流行。 PowerShell 的部分灵感来自交互式 UNIX shell,例如 zsh,部分来自 .NET 运行时。 它不是将所有内容都视为文本,这是 UNIX 世界中常见的概念,它允许对数据进行面向对象的操作。

尽管 Microsoft PowerShell 在 Windows 领域非常流行,但许多源自 UNIX 的程序(最著名的是 Git、Autotools 或 Make)往往更喜欢 Bourne Shell 的某些变体。 正因为如此,msys(与 Git for Windows 捆绑在一起)、Cygwin 或微软最近的 WSL 等项目诞生了。 如果您想在 Windows 上获得类似 Linux 的感觉,MSys 是这里的最佳选择。 如果您想要一个能够运行标准 Linux 二进制文件的全功能 Linux 环境,那么 WSL 就是您的最佳选择。 对于介于两者之间的东西——UNIX API 但编译为 Windows 可执行文件(只有在你真正知道为什么需要它时才使用它)——Cygwin 就是答案。

编辑

一旦你熟悉了你的 shell,你会想要学习一些有用的技能。 由于大多数编码工作都围绕着编写文本(代码、自述文件、提交消息),所以对交互式文本编辑器的良好了解是必不可少的。 有很多可供选择,并且由于编辑器是任何开发人员最必要的工具之一,对于哪个编辑器最好,可能有同样多的意见。

插图:命令行编辑器具有简单的界面

最流行的文本编辑器可以分为两个基本组:简单文本编辑器可编程文本编辑器

两者都非常适合编写代码,但是,顾名思义,可编程的提供了塑造和定制编辑器的能力,以完全满足您的需求。 不过,这是有代价的,因为它们的学习曲线往往更陡峭,并且可能需要更多时间来设置。

基本文本编辑器

在简单的文本编辑器中,GNU Nano 是最普遍的。 实际上,它是 pico 编辑器的克隆,所以如果您的系统上没有一个,您可以尝试另一个。 另一个更现代的替代品是微型编辑器。 如果你想要一些简单和可扩展的东西,这个是一个很好的起点。

可编程文本编辑器

许多开发人员依赖于来自不同阵营的可编程编辑器,例如 Vim 和 GNU Emacs。 两种编辑器都可以在控制台或 GUI 模式下运行,并且都对其他软件中的键绑定产生影响。 它们不仅提供 API,还提供内置的实际编程语言。 Emacs 专注于 LISP,而 Vim 使用自己的 VimL,但它也提供与其他流行脚本语言(如 Lua、Perl、Python 或 Ruby)的接口。 一种更新的 Vim 方法,称为 Neovim,也值得一提,因为它开始得到认真的追随者。

这可能有点令人困惑,但也有一个名为 vi 的编辑器,它是 Vim 的前身(顺便说一下,它代表“ Vi improvided ”)。 它比 Vim 简单得多,但如果你有足够的信心用 Vim 编写代码,如果你发现自己需要使用 vi,这对你来说应该不是挑战。

由于 pico/GNU Nano 和 vi/Vim 通常预装在各种系统上,因此至少掌握它们的基础知识是个好主意(退出 Vim 对于初学者来说是一个众所周知的难题)。 这样,如果您需要在远程计算机上编辑某些内容,无论已经存在什么编辑器,您都可以准备好。 在您的私人设备上,随意使用您认为最舒适的任何编辑器。

默认系统编辑器

最后要注意的一点是,您的系统可能有所谓的默认编辑器

$EDITOR环境变量指向默认编辑器,在与 Bourne 兼容的 shell(sh、bash、ksh、zsh)中,您可以通过输入echo $EDITOR来查看它。 如果该值与您的个人选择不同,您可以通过将export EDITOR=my-awesome-editor添加到 shell 的运行时配置( ~/.profile~./bashrc~/.zshrc等)来自行设置。

其他程序,例如版本控制系统和邮件客户端,将在需要更长的文本输入时使用此编辑器。

复用器

一旦你开始在 CLI 中做一些严肃的事情,你就会遇到在任何给定时间只能保持一个应用程序打开的限制。 编码时,您可能想要编辑代码、执行它、修复错误并再次执行。 在查找错误时,您可能希望列出日志并查看向服务器发送请求时记录的内容。 通常,这意味着在两个应用程序之间不断切换或打开多个终端窗口。

这是终端多路复用器可以帮助您的地方。 当谈到多路复用器时,有些人立即认为主题是 GNU Screen。 它是同类工具中第一个广泛使用的工具,今天仍然非常流行(通常默认安装)。 它的现代替代品是tmux ,不出所料,它代表“终端多重 x er ”。

这两个允许您在给定的终端会话中打开多个窗口并在这些会话之间自由切换。 它们允许您将窗口拆分为窗格,这有助于同时运行多个应用程序并实时观察它们的输出(无需切换任何窗口)。 此外,它们以客户端-服务器模式工作,这意味着您可以在任何给定时间分离它们,稍后再回来继续您上次中断的工作。 当人们想要持久的 IRC 会话时,最后一个功能导致 Screen 的流行。

对于大多数用例,GNU Screen 或 tmux 对你来说应该是很好的,但如果由于某种原因你认为它们占用的资源太重,还有更轻的替代品。 有 dtach/atach 和 abduco。 他们故意限制范围,但可以很好地履行各自的职责。

包管理器

此时,您可能会开始考虑在您的机器上安装所有上述软件。 一个问题是每个工具都有不同的安装说明。 有时,您需要下载源代码并自己编译它们,有时您会得到自包含的二进制文件,有时您会得到所谓的二进制包,这通常意味着与一些元数据一起压缩的可执行文件。

为了简化安装软件的过程,操作系统创建者提出了包管理器的概念。 简而言之,包管理器就像 CLI 和桌面应用程序的应用程序商店。 它比实际的应用商店早了几十年。 问题是几乎每个系统都有自己的包管理器。 Debian、Ubuntu 和衍生的 GNU/Linux 发行版使用 APT,基于 Red Hat 的发行版更喜欢 yum 或 DNF,其他 Linux 发行版有更奇特的软件安装方式,不同的 BSD 克隆也是如此。 除了内置的包管理器,还有用户安装的包管理器,比如用于 MS Windows 的 Chocolatey 和用于 Mac OS X/macOS 的 Homebrew。 当您想编写有关如何安装程序的说明时,您最终可能会为每个系统编写案例。 似乎有点过分了,不是吗?

幸运的是,最后提到的系统 Homebrew 可能是最便携的系统,这要归功于 Linuxbrew,它是 Homebrew 到 GNU/Linux 系统的一个端口。 有趣的是,如果你想在 Microsoft Windows 上获得类似的用户体验,它甚至可以在 WSL 上运行。 但请记住,WSL 不受官方支持。

那么,除了便携性,Homebrew 还能提供什么? 首先,它不会干扰系统包,因此您安装的所有内容都位于操作系统的单独层上。 此外,安装软件包通常不需要 root 权限。 因此,您可以拥有稳定且经过测试的系统包,但同时检查其较新版本而不会牺牲系统的稳定性。

如果您想测试编辑器,我之前提到过,您需要在使用 Homebrew 或 Linuxbrew 的系统上运行以下命令:

brew install emacs micro nano vim neovim

闪亮的东西

我们已经讨论过的内容无疑对工作很有用。 但也有一些应用程序,虽然不是必需的,但仍为日常生活带来舒适感。 您可能不需要它们,但了解它们总是值得的。

交互式过滤器

搜索命令历史记录可能很乏味。 虽然 bash 和 zsh 都具有 Ctrl+R 键绑定,但它一次只显示一个替换。 更重要的是,您需要输入您之前使用的确切文本。 由于这是一个很常见的操作,一旦你开始使用命令行,它看起来是一个可以改进的地方。

交互式过滤器,如 fzy、percol、peco 或 fzf 可帮助您过滤长行文本。 这可以是前面提到的命令历史记录、项目目录中的所有代码行,也可以是find . . 这里的一般想法是首先向您展示所有可用的行,然后依靠模糊查找算法过滤掉所有不匹配的内容。

例如,将 Ctrl+R 绑定到 fzf 会显示最新命令的列表,您可以使用箭头向上和向下导航,或者您可以键入git以仅显示内部某处具有 Git 的命令。 就个人而言,当我使用一个没有交互式过滤器的 shell 时,我突然感到有点失落。 这个功能真的很给力!

此外,您可以在可编程文本编辑器中使用交互式过滤器。 这样,您将在 shell 和编辑器之间拥有统一的搜索功能。

交互式导航器

当我主要处理 C++ 项目时,Facebook PathPicker 给了我很大的帮助。 编译器生成的错误日志可能会变得非常大而且非常讨厌,并且能够在该日志中找到实际路径的能力是生产力的福音。

在任何给定的文本文件中,或与 tmux 一起使用时屏幕的内容中,fpp 过滤除文件路径之外的所有内容。 然后它会显示一个 UI,您可以在其中选择一个或多个这些路径并使用它们运行命令。 当然,最常见的响应是在编辑器中打开文件,这是默认操作。

用户界面

您从事的项目中至少有一个使用 Git 作为版本控制系统。 虽然功能非常强大,但 Git CLI 并不是出色用户体验的巅峰之作。 为了减轻阅读 Git 帮助$SUBCOMMAND中所有选项的压力,我建议您查看 tig。 它为从中受益的操作提供了一个不错的控制台 UI,例如logblame

另一个旨在帮助 GIt 用户的工具是 fac,它是Fix All Conflicts的首字母缩写。 正如您可能已经猜到的那样,当您在进行合并或变基时遇到冲突时,它会派上用场。 它是 vimdiff 等其他合并工具的替代品。

文件管理器

90 年代曾有一段时间,每个人都想要一个两窗格的文件管理器。 这一趋势始于诺顿指挥官。 许多其他人也走上了同样的道路,但仍然看到稳定用户群的是午夜指挥官。 最明显的用例是使用 mc 来操作本地文件,但在使用远程机器时它也非常有用。

像大多数命令行程序一样,它非常轻量级,因此通过 ssh 运行它没有问题,并且由于支持 FTP 和 FISH 协议,您可以在一个窗格中显示本地文件系统,在另一个窗格中显示远程文件系统 — 方便当您想避免键入或复制文件名作为 scp 的参数时使用此功能。

CLI 工具只是为了好玩

他们说:“只工作不玩耍让杰克成为一个呆板的男孩。” 有很多程序,命令行和其他方式,只为您提供娱乐。 流氓视频游戏属于这一类。 它甚至为整个游戏类型命名! 其他流行的玩具是幸运和牛说,例如,如果你在 CI 脚本的某个地方使用它们,它们可以让你的一天不那么沉闷。

但对于我们中的一些人来说,首先使用控制台的主要吸引力在于感觉自己像电影中的黑客。 No More Secrets 和 Hollywood Hacker 很好地代表了这个群体。 当有人看着你工作时试试看,你的黑客信誉肯定会上升!

命令行实践

那么,命令行可以抵消学习如何使用 shell、编辑器和各种应用程序的所有开关所花费的时间,有什么吸引人的地方呢? 简短的回答是生产力,它来自两件事:

  • 一是当您只看到一个终端窗口时,您可以更加专注,因为没有太多可以分散您的注意力。 没有通知弹出,没有广告,没有漂亮小猫的照片。 只有你和你的目标。

  • 第二件事是自动化。 您可以将几个经常组合的操作放在一个脚本中,然后将其作为一个整体调用,而不是每次都手动输入。 通过搜索 shell 的历史,您可以快速回到您曾经编写的特别复杂的命令。 基本上,您可以录制和回放任何内容,并且代码可以作为您所做操作的文档。

添加别名的能力也有助于获得收益。 例如,我发现自己经常在 Git 中通过更新同一个提交直到它完美(目前)来制作提交。 一旦我暂存了所需的文件,我就会运行git carmh 。 不要试图在手册中查找它,因为它是我的私人别名,意思是commit --amend --reuse-message=HEAD 。 它肯定会节省一些打字。

问题是,人们会厌倦一遍又一遍地重复相同的动作,而无聊会降低注意力。 这可能导致错误和错误。 避免它们的唯一方法是不要将高焦点和低焦点动作交错。 编写代码是高度关注的,审查提交消息和内容是高度关注的,但是当您需要在这里和那里重复几次机械点击以进入提交审查阶段时,您的关注度可能会降低。 当然,命令行并非没有此类机械活动,但由于自动化,您可以避免其中的大部分活动。

进一步探索

您可能已经知道本文中提到的部分或全部命令行工具。 您可能在阅读时学到了一些新的有用的东西。 如果是这样,那就太好了——我在这里的目的不是提供对不同工具的全面概述和比较,而是展示一些我发现对我的日常工作很有帮助的重要工具,希望你会发现其中一些有用,也。

那里有更多有趣的命令行程序,如果您对它们感兴趣,我建议您查看 Awesome Shell 精选列表,其中列出了当今可用的一些最佳命令行工具。

大多数 GUI 应用程序都有对应的终端。 这包括 Web 浏览器、电子邮件客户端、聊天客户端(IRC、Slack、XMPP)、PIM 套件或电子表格。 如果您知道我没有提到的任何好程序,请在评论中提出。