17611538698
webmaster@21cto.com

为什么我们仍然使用命令行接口工具?

资讯 0 2469 2019-05-08 11:57:31

5.8_.3_.1_.jpg

 
 
在当今的网络世界中,各大互联网公司仍然在争抢流量,应用程序制造商更喜欢争夺移动应用的用户,相反桌面应用程序越来越失去竞争力。此外,随着网络应用成为越来越多用户的选择,桌面应用程序往往也不是网络应用的对手。
 
这是否意味着我们将很快放弃pc作为一个平台?不,当然不是,我不会这么说的。此外,虽然GUI应用程序最近发展似乎一直在停滞,但也有一部分桌面应用程序在继续增长。
 
你看过有黑客的电影吗?通常情况下,这些人被展示在显示器前工作,旁边就是某种终端(通常有黑暗的房间背景和明亮的显示器前端)。这个终端往往会充斥着传递的字符,这些字符显然对于屏幕前的黑客有重要的意义。
 
黑客在行动中的这种表现经常被专业开发人员嘲笑,甚至有一些程序只是为了好玩而模拟各种“黑客”效果。
 
然而,在现实世界中,命令行工具并不用于娱乐。
 
为什么我们仍然使用命令行接口工具?
 
本文主要讨论使用命令行接口(命令行接口,CLI)工具的实用方面。了解CLI命令和使用高质量的工具可以使您的开发更有效率,还可以打开各种自动化方法的大门,这些方法与GUI应用程序相比,在文本界面上更加实用。
 
在GUI中,您可以更好地执行重复任务,就算您的多次单击速度很快几乎是都可以听成单个长的单击。问题是,这仍然不能超过专门脚本的效率。更重要的是,手动执行相同的操作既增加了认知负荷,也增加了人为错误的可能性。和往常一样,我们依靠电脑来处理人类可能觉得无聊、重复或极大数量的任务。
 
值得知道的是,终端工具可以提供多种类型的接口。还有一些非交互的例子,比如ls,它只接受参数并提供输出。包管理器中最常见的是交互或半交互接口。(“确定要从未经验证的源继续安装吗?”)然后是文本用户界面(TUI),它们是为适应终端的限制而设计的交互式GUI应用程序。可能最有名的是Midnight Commander (MC),一个非常流行的(在90年代)Norton Commander.
 
基本命令行工具
 
如果你想成为一个擅长使用控制台的开发者,你需要给自己最低限度准备一个的命令行开发工具-这是最基本的必需品。你最肯定不能离开的东西是框架(便于制表符完成功能)和文本编辑器.
 
现在,我要提一下Unix哲学,这通常是工具的作者做出设计决策的基础,不管是有意识的还是无意的。其中一些要点可归纳如下:
 
把一切都当作文件。
只做一件事,但要做好。
从标准输入读取,写入标准输出,并将错误传递到标准错误流。
成功后,返回代码0。非零值意味着一个错误(可以由确切的返回代码指定)。
允许命令链接和脚本。
 
编译工具
 
打开终端时看到的第一件事是编译工具。这是使用户和机器之间的交互成为可能的部分。它解释命令,将它们拆分为程序名和参数,并执行抛出的所有shell命令。
 
历史上,有很多种不同的shell。其中最流行的是CSH(C Shell)和Bourne Shell的各种实现(通常简单地称为什)。Bourne Shell被扩展到Korn shell,这也获得了一些吸引力,并仍被其爱好者使用。CSH目前是一些BSD系统上的默认shell,而几乎所有其他类似UNIX的操作系统都喜欢某种Bourne Shell。Linux发行版倾向于支持巴什而MacOSX兹什作为默认选择。
 
还有Powershell,但它们远没有那么受欢迎,除了微软。
 
Powershell在Windows系统上,Powershell的灵感部分来自交互式UNIX shell(如zsh),部分来自.NET运行时。它不把所有东西当作文本来处理,这是UNIX世界中常见的概念,它允许对数据进行面向对象的操作。
 
尽管MicrosoftPowerShell在Windows领域非常流行,但许多起源于UNIX的程序(最著名的是Git、AutoTools或make)倾向于使用Bourne Shell的一些变体。正因为如此,像这样的项目msys (与Git for Windows捆绑)Cygwin,或者微软最近的WSL。如果你想在Windows上有类似操作Linux的感觉,MSys是这里最好的选择。如果您想要一个功能齐全的Linux环境能够运行标准的Linux二进制文件,那么WSL就是最好的选择。对UNIXAPI,但编译为Windows可执行文件(只有当您真正知道为什么需要它时才使用它)-Cygwin是最好的选择。
 
编辑
 
一旦你熟悉了你的shell,你就会想学到一些有用的技能。由于大多数编码工作都围绕着编写文本(代码、README、提交消息)进行,所以对交互式文本编辑器有很好的了解是必不可少的。有很多可供选择的地方,而且由于编辑器是任何开发人员最必要的工具之一,所以对于哪个编辑器最好也可能有很多争论。
 
最流行文本编辑器可分为两大类:简单文本编辑器和可编程文本编辑器.
 
两者都可以很好地编写代码,但是,正如其名称所示,可编程的编辑器提供了塑造和自定义编辑器的能力,以完全满足您的需要。然而,这是有代价的,因为他们也往往有一个更陡峭的学习曲线,可能需要更多的时间来熟悉。
 
Basic text editors
在简单的文本编辑器中,GNU Nano是最普遍的。实际上,它与pico 编辑器一模一样,因此,这俩个中任何一个都可以作为选择。另一种,更现代的,替代两者的方法是微编辑。如果你同时想要简单和可扩展的东西,这是一个很好的选择。
 
可编程文本编辑器
 
许多开发人员依赖于来自不同的可编程编辑器,例如Vim 和GNU Emacs。两个编辑器都可以在控制台或GUI模式下运行,并且都会对其他软件中的键绑定产生影响。它们不仅提供了API,而且还提供了内置的实际编程语言。Emacs主要关注LISP,Vim使用自己的VIML,但它也提供与其他流行脚本语言(如Lua、Perl、Python或Ruby)的接口。最近使用Vim的方法称为新维姆,也值得一提,因为它正开始得到一个认真的追随者。
 
这可能有点令人困惑,但也有一个被称为它是Vim的前身(顺便说一句,它代表“Vi Improded”)。它比Vim简单得多,但是如果您有足够的信心用Vim编写,那么如果您发现自己需要使用vim,就不应该把它看作是一个挑战。
 
由于pico/GNU Nano和vi/Vim通常都是预先安装在各种系统上的,因此至少掌握它们的基本知识是个好主意(对于初学者来说,Vim是一个众所周知的难题)。这样,如果您需要在远程机器上编辑某些内容,那么无论哪个编辑器已经存在,您都将做好准备。在你的私人设备上,可以随意使用任何你觉得最舒服的编辑器。
 
默认系统编辑器
 
最后要注意的一点是,您的系统可能有所谓的默认编辑器。
这个$EDITOR环境变量指向默认编辑器,在与Bourne兼容的shell(sh、bash、ksh、zsh)中,您可以通过输入查看它。echo $EDITOR。如果该值与您的个人选择不同,您可以通过添加导出来自己设置它。EDITOR=my-awesome-editor到shell的运行时配置(~/.profile, ~./bashrc, ~/.zshrc等等)。
 
其他程序(如版本控制系统和邮件客户端)将在需要较长文本输入时使用此编辑器。
 
复用器
 
一旦您开始在CLI中做一些事情,您就会遇到这样的限制:在任何给定的时间只能打开一个应用程序。在编写代码时,您可能希望编辑代码、执行代码、修复错误并再次执行。在查找bug时,您可能希望列出日志,并查看向服务器发送请求时记录了哪些日志。通常,这要么意味着在两个应用程序之间不断切换,要么意味着打开多个终端窗口。
 
这是终端复用器可以帮助你的地方。当谈到多路复用器时,有些人立刻认为将要提到的是GNU Screen。这是第一个广泛使用的同类工具,今天仍然非常流行(通常是默认安装)。。
 
这两个工具允许您在给定的终端会话中打开多个窗口,并在这些会话之间自由切换。它们允许您将窗口拆分为窗格,这有助于同时运行多个应用程序并实时观察它们的输出(不需要切换任何窗口)。而且,它们在客户机-服务器模式下工作,这意味着您可以在任何给定的时间分离它们,然后再回来继续您停止的工作。这最后一个特性导致了GNU Screen的流行,
 
对于大多数用户来说,GNU Screen或tmux对您来说应该是很好的,但是如果出于某种原因,您会认为它们在占用太多运行速度,也有更轻的替代方案。有atach和 abduco。他们的任务范围有限,但能够很好地履行各自的职责。
 
包管理器
 
此时,您可能会开始考虑将上述所有软件安装到您的计算机上。一个问题是,每个工具都有不同的安装说明。有时,您需要自己下载源代码并编译它们,有时您得到了自包含的二进制文件,有时您得到了所谓的二进制包,这通常意味着一个可执行文件与一些元数据一起压缩。
 
为了简化软件安装过程,操作系统创建者提出了包管理的概念。简单地说,包管理器就像CLI和桌面应用程序的应用程序商店。它比实际的应用程序商店早了几十年。问题是几乎每个系统都有自己的包管理器。Debian、Ubuntu和派生的GNU/Linux发行版使用APT,基于RedHat的发行版更喜欢YUM或DNF,其他Linux发行版有更奇特的安装软件的方法,不同的BSD克隆也是如此。除了内置包管理器外,还有用户安装的包管理器,如Chocolatey 对于MS Windows和用于MacOSX/MacOS。当您想要编写关于如何安装程序的说明时,您可能最需要为每个系统编写用例。似乎有点太麻烦了,不是吗?
 
幸运的是,最后一个提到的系统-Homebrem-可能是最轻量级的,这要归功于Linuxbrew的一个端口到GNU/Linux系统。有趣的是,如果您想在MicrosoftWindows上有类似的用户体验,它甚至可以在WSL上工作。不过,请记住,WSL并不是官方支持的。
那么,除了轻量级之外, Homebrew还能提供什么呢?首先,它不会干扰系统包,所以您安装的所有东西都驻留在操作系统的一个单独的层上。此外,安装软件包通常不需要根权限。因此,您可以拥有稳定和经过测试的系统包,但同时检查它们的更新版本而不牺牲系统的稳定性。
 
如果您想测试编辑器,我在前面提到过,您需要在一个系统上运行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和编辑器之间具有统一的搜索功能。
 
交互式导航仪
 
Facebook路径选择器在我主要从事C+项目的时候,这是一个很大的帮助。编译器生成的错误日志可能会变得非常大和非常糟糕,而在该日志中找到实际路径的能力是一种生产力的提升。
在任何给定的文本文件中,或将屏幕的内容与tmux,FPP过滤除文件路径之外的所有内容。然后,它将显示一个UI,您可以在其中选择一个或多个路径,并使用它们运行一个命令。当然,最常见的响应是在编辑器中打开文件,这是默认操作。
 
Git UI
 
所使用的项目中至少有一个项目是有可能的。吉特作为一个版本控制系统。虽然Git CLI功能强大,但它并不是优秀用户体验的巅峰。为了减轻压力,阅读Git帮助中的所有选项$SUBCOMMAND,我建议你退房破伤风免疫球蛋白。它为从中受益的操作提供了一个很好的控制台用户界面,如log或blame.
 
另一个旨在帮助git用户的工具是FAC,它是修复所有冲突。正如您可能已经猜到的,当您在进行合并或重基时遇到冲突时,它是有用的。它可以替代其他合并工具,比如vimdiff。
 
更多:每个DevOps专家应该知道的8个基本工具档案管理器
在90年代有一段时间,每个人都想要一个双窗格文件管理器。这一趋势始于诺顿指挥官。许多其他用户遵循相同的路径,但仍然看到稳定的用户群的是午夜指挥官。最明显的用例是使用MC操作本地文件,但在使用远程机器时也非常有用。
 
就像大多数命令行程序一样,它非常轻量级,所以在ssh上运行它是没有问题的,并且由于支持FTP和FISH协议,您可以在一个窗格中看到本地文件系统,而在另一个窗格中可以看到远程文件系统-这是一个方便的特性,当您想避免键入或复制文件名作为scp参数时。
 
CLI工具只是为了好玩
 
“只工作,不玩耍,杰克就是个笨的男孩。”正如民间所说。有许多程序,命令行和其他工具只为您提供娱乐。这个Roguevideo game属于这一类。它甚至给整个游戏类型起了名字!其他受欢迎的工具有
fortuneandcowsay,例如,如果您在CI脚本中使用它们,就会使您的一天变得不那么枯燥。
 
但对我们中的一些人来说,首先使用控制台的主要吸引力是感觉自己像电影中的黑客。不再是和好莱坞黑客很好地代表这个群体。当有人看着你工作的时候试一试,别人会更加相信你是个黑客!
 
命令行在实践中
 
那么,用命令行来抵消学习如何使用shell、编辑器和各种应用程序的所有开关所花费的时间,有什么吸引力呢?简单的回答是生产力,它来自两件事:
 
一个是当你只有一个终端窗口而没有更多的东西时,你可以更加集中注意力,因为没有什么可以分散你的注意力。没有弹出通知,没有广告,没有漂亮小猫的照片。只有你和你的目标。
 
第二件事是自动化。您可以将几个经常组合的操作放在一个脚本中,然后作为一个整体调用它,而不是每次都手工输入它们。您可以通过搜索shell的历史,快速返回到您曾经写过的一个特别复杂的命令。基本上,您可以记录和重播任何内容,代码可以作为您所做工作的文档。
 
增加别名的能力也有助于增加效率。例如,我发现自己经常在Git中通过更新同一个Git来完成提交,直到它变得完美为止(暂时)。一旦我生成所需的文件,我就运行git carmh。不要试图在手册中查找它,因为它是我的私人别名,意思是commit --amend --reuse-message=HEAD。它确实节省了一些打字时间。
 
问题是,人们会厌倦一遍又一遍地重复同样的行为,而无聊则会减少注意力。这会导致错误和错误。避免它们的唯一方法是不要将高聚焦和低聚焦的行为交织在一起。编写代码是高度集中的,检查提交消息和内容是高度集中的,但是当您需要重复几次机械点击以达到提交评审的阶段时,您的关注点就会降低。当然,命令行并不是没有这种机械活动的,但是由于自动化,您可以避免其中的大多情况。
 
进一步探索
 
您可能已经知道本文中提到的一些或所有命令行工具。在阅读时,你可能学到了一些新的和有用的东西。如果是这样的话,那太好了-我在这里的目的不是对不同的工具进行全面的概述和比较,而是展示一些我在日常工作中发现有帮助的重要工具,希望你能发现其中一些工具也很有用。
 
大多数GUI应用都有相应的终端。这包括浏览器、电子邮件客户端、聊天客户端(IRC、Sack、XMPP)、PIM套件或电子表格。如果你知道我没有提到的好程序,请在评论中提出来。
 

作者:Piotr Gaczkowski
编译:21CTO


 
相关文章:
 
编写 Shell 脚本的最佳实践
Shell 的18条常用命令整理
Shell 在手,天下我有--分析服务器日志不愁?
一篇文章学懂Shell脚本,最简明的教程在这里
20 分钟 Shell 入门深度教程

评论