作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Piotr Gaczkowski的头像

Piotr Gaczkowski

具有在Intel和ADVA获得的低级(C/ c++)和高级(Python)经验, Piotr遵循DevOps的道路来构建伟大的产品.

Previously At

Pluralsight
Share

In today’s online world, 吸引用户的战斗仍在继续, 应用开发者更喜欢手机或网页应用. 桌面应用程序正变得越来越不重要. Moreover, 它们也只不过是web应用程序的富客户端——electron是最受欢迎的选择.

这是否意味着我们将很快放弃桌面这个平台? 不,当然不是,我不会这么说. Besides, 而GUI应用程序最近似乎停滞不前, 有一部分桌面应用还在持续增长.

你看过关于黑客的电影吗? More often than not, 这些人在显示某种终端的显示器前工作(通常是深色背景和浅色前景)。. This terminal, in turn, 往往充斥着对观看他们的人来说显然有某种意义的路过的角色.

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

这种黑客行为的表现经常被黑客们嘲笑 professional developers,甚至还有一些程序可以模拟各种“黑客”效果,只是为了好玩.

然而,在现实世界中,命令行工具并不是为了其娱乐价值而使用的.

为什么我们还在使用命令行界面工具

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

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

值得了解的是,终端工具可以提供几种类型的接口. 有非互动性的,比如 ls,它只是接受参数并提供输出. 在包管理器中最常见的是交互或半交互接口. (“您确定要从未经验证的来源继续安装吗??”) Then, 有文本用户界面(tui), 哪些是为适应终端限制而设计的交互式GUI应用程序. Probably the most famous one is Midnight Commander (mc),一个非常流行的克隆(在90年代) Norton Commander.

Essential Command Line Tools

如果你想成为掌机玩家, 您需要为自己配备一组最低限度的命令行开发人员工具——最基本的必需品. 你生活中最离不开的东西是巧克力 interactive shell (目标是使用方便的选项卡完成功能)和 text editor.

插图:基本的命令行工具

Now, I will mention the UNIX philosophy, 工具作者所做的设计决策背后的基础是什么, whether consciously or not. 其中一些关键点可以总结如下:

  • Treat everything as a file.
  • 只做一件事,但要做好.
  • Read from standard input, write to standard output, 并将错误传送到标准错误流.
  • When succeeded, return code 0. 非零值表示错误(可以由确切的返回代码指定)。.
  • 允许命令链和脚本.

Shell

打开终端时首先看到的是一个shell. 这是使用户和机器之间的交互成为可能的部分. It interprets your commands, 将它们拆分为程序名和参数, 并执行您输入的所有shell命令.

历史上,有许多不同种类的贝壳. 其中最受欢迎的是 csh (C Shell)和Bourne Shell的各种实现(通常简称为 sh). 伯恩壳牌被扩展到科恩壳牌,也获得了一些牵引力,仍然被它的爱好者使用. 目前,Csh是一些BSD系统的默认shell, 而几乎所有其他类unix操作系统都更喜欢某种Bourne Shell. Linux发行版倾向于 bash while Mac OS X comes with zsh as the default choice.

还有其他可能的选择,但它们远没有那么受欢迎,除了微软 PowerShell on Windows systems. PowerShell的灵感部分来自交互式UNIX shell,如zsh,部分来自 .NET runtime. 而不是把所有东西都当作文本, a concept common in UNIX world, 它允许对数据进行面向对象的操作.

尽管微软PowerShell在Windows领域非常流行, 许多源自UNIX的程序(最著名的是Git), Autotools, (或Make)倾向于喜欢Bourne Shell的一些变体. 正因为如此,项目如 msys (bundled with Git for Windows), Cygwin, or Microsoft’s recent WSL were born. 如果您想在Windows上获得类似linux的感觉,那么MSys是最好的选择. 如果您想要一个能够运行标准Linux二进制文件的全功能Linux环境, then WSL is the way to go. 对于介于unix API之间的东西,但编译为Windows可执行文件(只有当您真正知道为什么需要它时才使用它)-Cygwin是答案.

Editor

一旦熟悉了shell,您就会想要学习一些有用的技能. 由于大多数编码工作都是围绕编写文本(代码)展开的, READMEs, commit messages), 交互式文本编辑器的良好知识是必不可少的. There are many to choose from, 由于编辑器是任何开发人员最必要的工具之一, 关于哪个编辑器是最好的,可能也有很多意见.

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

The most popular text editors 可分为两个基本组: Simple text editors and programmable text editors.

两者对于编写代码都非常有用, but, as the name suggests, 可编程的提供了塑造和定制编辑器的能力,以完美地满足您的需求. This comes at a price, though, 因为他们也往往有一个陡峭的学习曲线,可能需要更多的时间来设置.

Basic Text Editors

Among the simple text editors, GNU Nano is the most widespread. Actually, it is a clone of the pico 编辑器,所以如果您的系统上没有可用的一个,您可以尝试另一个. 与两者相比,另一种更现代的选择是 micro editor. 如果您想要一些既简单又可扩展的东西,那么这是一个很好的起点.

Programmable Text Editors

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

这可能有点令人困惑,但还有一个编辑器叫做 vi 它是Vim的前身(顺便说一句,Vim代表“Vi improved”). It is much simpler than Vim, 但如果你有足够的信心用Vim写, 如果您发现自己需要使用vi,这对您来说应该不是一个挑战.

由于pico/GNU Nano和vi/Vim通常预装在各种系统上, 至少掌握它们的基础知识是一个好主意(对于初学者来说,退出Vim是一个众所周知的难题)。. This way, 如果你需要在远程机器上编辑一些东西, 无论已经有什么编辑器,您都将准备好. 在你的私人设备上,可以随意使用任何你觉得最舒服的编辑器.

Default System Editor

最后要注意的一点是,您的系统可能有所谓的a default editor.

The $EDITOR 环境变量指向默认编辑器,并且在bourne兼容的shell (sh, bash, ksh, zsh) you can see it by entering echo $EDITOR. 如果该值与您的个人选择不同,您可以通过添加 export EDITOR=my-awesome-editor 到shell的运行时配置(~/.profile, ~./bashrc, ~/.zshrc, and so on).

Other programs, 例如版本控制系统和邮件客户端, 当他们需要更长的文本输入时,会使用这个编辑器吗.

Multiplexer

只要你开始在CLI中做一些重要的事情, 您将遇到在任何给定时间只能保持一个应用程序打开的限制. 在编码时,您可能希望编辑代码,执行代码,修复错误,然后再次执行. When looking for a bug, 您可能希望列出日志,并查看在向服务器发送请求时记录的内容. Typically, 这意味着要么在两个应用程序之间不断切换,要么打开几个终端窗口.

这就是终端多路复用器可以帮助您的地方. 当谈到多路复用器时,有些人立即认为这个话题是 GNU Screen. 它是同类工具中第一个广泛使用的工具,今天仍然非常流行(通常默认安装)。. Its modern replacement is tmux 不出所料,它的意思是“terminal multiplexer.”

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

For most use cases, GNU Screen或tmux应该非常适合您, 但如果出于某种原因,你会认为他们对资源的要求太高, 也有更轻的替代品. There’s dtach/atach and there’s abduco. 他们的工作范围是有限的,但却能很好地履行各自的职责.

Package Manager

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

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

幸运的是,最后提到的系统,Homebrew,可能是最便携的一个,感谢 Linuxbrew,将自制软件移植到GNU/Linux系统. The funny thing is, 如果您想在Microsoft Windows上获得类似的用户体验,它甚至可以在wsdl上工作. 但是请记住,官方并不支持WSL.

那么,除了可移植性,家酿还能提供什么呢? First of all, 它不会干扰系统软件包, 因此,您安装的所有内容都位于操作系统的单独层上. 此外,安装包通常不需要root权限. You can, therefore, 拥有稳定且经过测试的系统包,但同时在不牺牲系统稳定性的情况下检查其新版本.

如果你想测试编辑器, 我之前提到过,在Homebrew或Linuxbrew系统上,你所需要做的就是运行这个命令:

Brew安装emacs微纳vim neovim.

The Shiny Stuff

我们所讨论的对工作无疑是有用的. 但也有一些应用,虽然不是必需的,但仍然给日常生活带来舒适. 你可能不需要他们,但了解他们总是值得的.

Interactive Filter

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

Interactive filters, like fzy, percol, peco or fzf 帮助您过滤长行文本. 这可以是前面提到的命令历史记录, 项目目录中的所有代码行, 生成的文件名列表 find .. 这里的总体思路是首先向您展示所有可用的行,然后依靠模糊查找算法过滤掉所有不匹配的行.

For example, 将Ctrl+R绑定到fzf将显示最新命令的列表, 你可以用箭头上下导航, or you can type git 只显示包含Git的命令. Personally, 当我使用一个没有交互式过滤器的shell时, 我突然感到有点迷茫. 这个功能真的很吸引人!

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

Interactive Navigator

Facebook PathPicker 是一个很大的帮助,当我主要工作与c++项目. 编译器生成的错误日志可能会变得非常大而且非常糟糕, 在日志中找到实际路径的能力是生产力的福音.

在任何给定的文本文件中,或屏幕上的内容时使用 tmux, FPP过滤除文件路径以外的所有内容. 然后呈现一个UI,您可以在其中选择一个或多个路径并使用它们运行命令. 最常见的响应是在编辑器中打开文件, of course, which is the default action.

Git UI

很有可能您从事的项目中至少有一个使用过 Git as a version control system. 虽然Git CLI非常强大,但它并不是优秀用户体验的顶峰. 为了给您节省一些压力,请通读Git帮助中的所有选项 $SUBCOMMAND我建议您退房 tig. 它为从中受益的操作提供了一个很好的控制台UI,比如 log or blame.

另一个旨在帮助GIt用户的工具是 fac, which is an acronym for Fix All Conflicts. As you might have guessed, 当您在进行合并或重组时遇到冲突时,它会派上用场. 它是其他合并工具(如vimdiff)的替代品.

File Manager

在90年代有一段时间,每个人都想要一个双窗格的文件管理器. The trend started with Norton Commander. 许多其他公司也走了同样的道路,但仍然拥有稳定用户基础的是 Midnight Commander. 最明显的用例是使用mc操作本地文件, 但是,在使用远程机器时,它也非常有用.

Like most command-line programs, it’s very lightweight, 因此,通过ssh运行它没有问题,并且由于支持FTP和FISH协议, 您可以在一个窗格中显示本地文件系统,在另一个窗格中显示远程文件系统——当您希望避免输入或复制文件名作为SCP的参数时,这是一个方便的特性.

CLI Tools Just for Fun

“只工作不玩耍,聪明孩子也变傻。” they say. 有很多程序,命令行和其他方式,只是为您提供娱乐. The Rogue 电子游戏就属于这一类. 它甚至给整个游戏类型起了名字! Other popular toys are fortune and cowsay例如,如果您在CI脚本的某个地方使用它们,可以使您的一天不那么无聊.

But for some of us, 首先,使用主机的主要吸引力在于感觉自己就像电影中的黑客. No More Secrets and Hollywood Hacker represent this group well. 当有人看着你工作时尝试一下,你的黑客信誉肯定会上升!

Command Line in Practice

So, 是什么吸引人的命令行,抵消了学习如何使用shell所花费的时间, the editor, 以及各种应用的所有开关? The short answer is productivity, which comes from two things:

  • 一种是当你只看到一个终端窗口时, you can focus more intensely, 因为没有太多东西让你分心. 没有弹出通知,没有广告,没有漂亮小猫的照片. Just you and your goal.

  • The second thing is automation. 您可以将几个频繁组合的操作放在一个脚本中,然后作为一个整体调用它,而不是每次都手工输入它们. 通过搜索shell的历史记录,您可以快速回到曾经编写的特别复杂的命令. Basically, 你可以记录和回放任何东西, 代码可以作为您所做的工作的文档.

添加别名的能力也有助于提高性能. For example, 我发现自己经常在Git中通过更新相同的提交来制作提交,直到它完美(目前)。. 一旦我准备好所需的文件,我就运行 git carmh. 不要去查手册,因为这是我个人化名的意思 commit——modify——reuse-message=HEAD. It saves some typing for sure.

问题是,人们会厌倦一遍又一遍地重复同样的动作,而无聊会降低注意力. 这可能会导致错误和错误. 避免它们的唯一方法是不要将高焦点和低焦点的操作交叉进行. 编写代码是重点,审查提交消息和内容也是重点, 但是当你需要在这里和那里重复几个机械性的点击来进入提交审查阶段时, 很有可能你的注意力降低了. Command line isn’t, of course, 无此类机械活动的, but thanks to automation, you can avoid most of them.

Further Explorations

您可能已经了解了本文中提到的一些或所有命令行工具. 在阅读的过程中,你可能会学到一些新的有用的东西. If so, 非常好——我在这里的目的不是提供不同工具的全面概述和比较, 而是要展示一些我发现在日常工作中很有用的关键工具, 希望你能从中找到一些有用的东西, too.

还有更有趣的命令行程序, 如果你对它们感兴趣, I recommend checking the Awesome Shell 精选了一些当今可用的最佳命令行工具.

大多数GUI应用程序都有对应的终端. That includes web browsers, email clients, chat clients (IRC, Slack, XMPP), PIM suites, or spreadsheets. 如果你知道任何我没有提到的好程序,请在评论中提出.

Understanding the basics

  • What is a command line argument?

    命令行参数用于将信息传递给程序. 例如," cat /tmp/file "表示"以' /tmp/file '作为参数运行命令' cat '。.它指示“cat”命令打开传递的文件.

  • 什么是命令行界面?

    命令行接口(CLI)是一种与缺乏GUI的程序交互的方法. 它可以是交互式的,但也可以只处理参数并返回响应.

  • CUI和GUI的区别是什么?

    图形用户界面(GUI)使用窗口和图标等元素与应用程序(如web浏览器)进行交互。. 命令行用户界面(CUI)尝试在终端中只使用可打印字符来模拟这种行为.

  • 如何使用命令行(在不同的系统上)

    To use command line, 您需要打开终端仿真器, 它们的名称中通常包含“Terminal”或“cmd”这个词. 对于远程系统,这将是Putty或“ssh”.”

就这一主题咨询作者或专家.
Schedule a call
Piotr Gaczkowski的头像
Piotr Gaczkowski

Located in Gdańsk, Poland

Member since November 24, 2016

About the author

具有在Intel和ADVA获得的低级(C/ c++)和高级(Python)经验, Piotr遵循DevOps的道路来构建伟大的产品.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Previously At

Pluralsight

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

Toptal Developers

Join the Toptal® community.