分享

Linux要想用得好这门手艺就要耍得开(高手们只要掌握不多的一些命令就可以从容完成许多复杂的任务)

 山峰云绕 2023-01-05 发布于贵州

  (高手们只要掌握不多的一些命令就可以从容完成许多复杂的任务)

shell 编程的本质,就是将多步骤的复杂任务分解,然后使用流程控制语句将命令行串接起来,从而实现强大的自动化处理。

Linux 还要用鼠标吗?


https://www.toutiao.com/article/7184726094896038458/?log_from=4c999ea9ac0ed8_1672889779984



现在找互联网行业的技术工作,有一项技能是必备的,那就是能熟练使用 Linux 操作系统。无论你是想做开发、测试、运维,看看各大厂的要求吧,都要求会 Linux。

Linux 并不容易上手,尤其是它的命令行(Command Line Interface, CLI)操作方式会让初学者难以适应。不过有句话说的是:GUI 使简单的工作更简单,而 CLI 使完成艰难的任务成为可能。

记得我刚入行时,用 Linux 还在 GUI 界面下操作。结果有一回去跟一位技术大牛做对接就出糗了,我正到处寻摸鼠标,大牛一脸嫌弃地说:“Linux 还要用鼠标吗?”

大牛说着调出命令行界面,手指在键盘上一通飞舞,就把一个我认为很困难的任务给快速搞定了。这是我对命令行的威力,第一次有直观的感受。当然,大牛的那句话我也一直记到现在。

命令行,就是 Linux 对外提供的人机操作接口。对于技术人来说,把操作命令行这门手艺修炼好,就可以将 Linux 的强大能力发挥出来。

进入命令行世界的第一站,我们先了解一下命令行的哲学。

命令行哲学:极致的艺术

对于第一次打开 Linux 终端的初学者来说,最痛苦的有两件事:第一是瞪着屏幕上闪烁的光标,总觉得这样操作太低级;第二是看着1000多个系统命令心发慌,这怎么学得完?

平心而论,学习 Linux 命令行的门槛也就在这里,但为什么要这么设计呢?这就要从 Linux 操作系统的设计理念说起。

Linux 其实是一种类 Unix 操作系统,而 Unix 是出自贝尔实验室的 Kenneth Thompson 之手。Thompson 大神在设计 Unix 命令时化繁为简,定下了一个基调:一次只做一件事,做到极致。

Kenneth Thompson

这个意思就是某个命令行程序,它只完成一项任务,并且把这项任务做到功能完备。例如 echo 就是回显文本;cat 就是显示文件内容;ls 就是显示磁盘目录内容。你要做什么,第一反应就是这个程序,而不会想到别的。

当我们理解了这个设计思想后,可能又会觉得这个道理太简单了,好像天经地义的一样。但这也是经历了前人的失败之后才总结出来的经验,大神不同于常人之处,就在于他能想到用最简单的办法去解决最复杂的问题。

所以,我们在学习 Linux 命令行时,没有必要去熟悉所有命令程序。只需要掌握好最常用的几十个命令,并能根据任务要求去检索一些特殊的命令进行组合,这就能很好地完成工作了。

明白了道理,就要踏实做好实践。为了打消你放弃的念头,我们就从实例上手。

命令行初探:从入门到放心

探索 Linux,最佳起点是学会操作文件系统。因为这包括如何切换目录、查找文件、编辑文本、运行可执行程序等。在此我假设各位已经安装好了一个 Linux 发行版,并且知道如何打开一个终端 Terminal 窗口。

终端窗口是与 Linux 的 shell 程序打交道,它会将用户输入的命令文本传输给 shell,然后 shell 会传递给 Linux 内核去执行,得到结果后再返回给终端窗口。

基本文件操作

 $ mkdir test #新建一个名为 test 的空目录
 $ ls #列举当前目录下的文件并显示出来,可以看到 test 目录已经存在
 test
 $ cd test #进入 test 目录内
 $ pwd #显示当前目录的完整路径
 /home/work/test
 $ touch one.txt #touch 命令用于修改文件的访问和修改时间,文件不存在时则新建,此处用来创建一个空文件
 $ cp one.txt two.txt #将 one.txt 复制一个副本为 two.txt
 $ mv one.txt .. #将 one.txt 文件移动到上一级目录中
 $ rm ../one.txt #将上级目录中的 one.txt 文件删除

掌握了这几个命令,就可以对 Linux 的树形目录组织结构进行游历了。例如 /usr 目录下都有哪些子目录,每个子目录中又有什么内容。友情提示:不要在 root 权限下执行 rm -rf /,不要执行,不要执行,因为这个事故责任我担不起哈。

留一个思考题,如何在大量的文件中查找某个文件是否存在,例如在 /usr/bin 目录下查找python程序。提示:可使用 find 命令。

神奇的管道

不知道你注意到没有,单个命令只能完成一件事,那么复杂一点的需求怎么完成?答案是把命令行进行组合,它依赖的技术就是管道。

这是 Thompson 大神的神来之笔,其实他当年也受困于如何在程序之间传递数据的问题。后来有一天如同上帝亲吻了他的脑门,他猛然悟道,于是只用了一个小时就在系统调用中实现了管道。这就是将程序的孤岛给连接起来的竖线符:“|”。

用实例来感性体验一下,问:/usr/bin 目录下总共有多少个文件?你还在一个一个数吗,我的是 1060。下面就是我的方法:

 $ ls /usr/bin | wc -l #wc 命令通过管道接收 ls 的输出,并按要求统计数量。-l 参数设定为换行分隔 
 1060

这就是组合的威力,也是为什么高手们只要掌握不多的一些命令,就可以从容完成许多复杂的任务。当然,这也需要不断思考和练习,逐步提升水平。如果上来就是大力出奇迹的蛮干,那只能在一个低水平里重复。

玩熟一个文本编辑器

在 Linux 下编辑文本是最常用操作,程序员写代码、测试写脚本、运维改配置,都绕不开这一步。我强烈建议大家不要只在 Windows 上编辑文件然后上传,而要踏实掌握一个文本编辑器,例如 vim。

尽管 vim 有最难学会的编辑器称号,但掌握了它会有多爽真的只有自己才知道。关于学习 vim 的建议我只有一个,那就是运行 vimtutor 命令,这是一个交互式的学习环境,轻松就助你掌握 vim。

学习到这里还没放弃,我想你应该对 Linux CLI 感到放心了,下面我们就更进一步,走向专业之路。

命令行进阶:shell 编程

卓越的工程师都对效率有着偏执的追求,他们无法忍受低效重复的工作,总要想尽办法使之自动化。Linux 下的 cron 这个定时自动执行命令,就是 Thompson 大神亲手所写。据说“cron”是他为了纪念希腊语的“时间”一词。

可以说,shell 编程能力的高低,是专业和业余的分野。shell 编程的本质,就是将多步骤的复杂任务分解,然后使用流程控制语句将命令行串接起来,从而实现强大的自动化处理。

shell 编程脚本语言提供的语法特性并不多,因为它的目标本来就是助力自动化,而不是成为一门特性完备的编程语言。简单的语法有利于使用者快速掌握它,并形成生产力。

我们来思考一个稍有些难度的需求:创建 100 个文件,以 0 ~ 99 命名,文件名后缀为“txt”,并在每个文件内写入一个随机数。

你打算用 vim 挨个创建并输入?千万不要这么干,下面给出一种解法:

 #!/bin/bash 
 #使用 bash 作为脚本代码的解释器
 
 for ((i=0; i<100; i++))  #bash 支持 C 语言风格的 for 循环写法
 do
        echo $RANDOM > $i.txt 
        #RANDOM是shell内置随机数变量;> 是重定向符,将 echo 命令输出内容输入到文件中
 done

将上述代码保存至一个脚本文件,例如 genfiles.sh 中,修改文件属性为可执行,然后在终端中执行./genfiles.sh命令,就可以进行验证。

不要满足于理解这个例子,结合工作中的实际需求,多做 shell 编程练习,成为真正的 Linux 高手吧。

结语

记得在工作多年之后,给新人培训 Linux 操作时,有位小伙子很殷勤地帮我把鼠标递过来,我下意识地就说了一句“Linux 还要用鼠标吗?”

说完这话我自己也觉得有意思,于是就跟他们分享了我当初的那段经历。现在他们也成长起来了,不知道会不会把这个故事流传给更多人。

现在 Linux 已经是互联网的基础设施,对它的操作哪怕是生疏一些,都会在工作效率上被别人拉下一大截。所以技术人要在自己的技术栈中,将 Linux CLI 操作排在重要位置,多想多练。

最后,手边常备《Linux 命令行大全 第2版》,你需要知道的命令行知识里面全都有。你能不能把操控命令行这门手艺,耍得风生水起,就看你读书是不是认真啦。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多