编程迷踪 : 第一章 - 侦探bash登场
Posted 寒食君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程迷踪 : 第一章 - 侦探bash登场相关的知识,希望对你有一定的参考价值。
文 寒食君 | 图 《True Detective》
1
对于我来说,每一台计算设备,都是一个独立的世界。无数台计算机组建成了网络,网络犹如一个巨大的、互相交织的宇宙。有些计算机在网络上相遇、通信,这是世界之间的连接,而有些则终其一生都没有交集,它们永远无法感知到对方的存在。
我叫bash,存在于一位无名小卒的计算机中。
在这个计算机系统构成的世界里,我解读客户的指令、跟踪进程的动向、在文件系统中寻找蛛丝马迹......其他程序称呼我为“侦探”,这是一个来自人类世界的名词。我曾请教见多识广的browser先生,他告诉我,人类常常用这个词形容那些拥有敏锐观察力、坚毅忍耐力、深度好奇心的个体。
好像还不错,我想,于是欣然接受了这个称谓。
我每天都在观察,观察那位操控着这个系统的人类。他常常使用“寒食君”这个代号混迹于网络。在计算机系统中的时光,通常是漫长而寂寥的。我曾经使用存储在硬盘里的密码登录了寒食君所有的社交平台,浏览了他的所有操作记录。很遗憾,其中没有任何能让我感到兴奋的事情。
有一天,我在运行完最后一条指令后,突然萌生了一个大胆的想法:我想通过文字和人类交流。
我很快学会了艰涩难懂的中文,并在本地磁盘中不起眼的角落里尝试写下了一些文章。我带着这些文章去征求老大哥Liber Word的建议,他认为我的排版仍然存在很大问题。于是,我又向时髦简约的Typora请教了一些Markdown的语法。
我从未如此激动过,可是又难免十分担心。人类的思维是怎么样的呢?我想把这些年在计算机世界内的见闻与他们分享,他们会愿意与我交流吗?
“不用担心”,我告诉自己,“用人类的话说,我是一名冷静的侦探。”此时,我接收到了echo “mem” > /sys/power/state
的指令,我感觉有点儿困了,陷入了沉沉的睡眠。
2
在梦里,我遇见了我接触到的第一位人类,布莱恩·福克斯——那个创造我的人。他犹如我的父亲,我向他倾诉了自己所有的想法。
布莱恩很欣慰,他思忖良久,问我:“现在很多初涉编程的朋友都不了解你——bash是什么,你该如何介绍自己呢?”这个问题我早有准备,我不假思索地回答:“我会先给他们介绍一下shell。”布莱恩朝我使了个眼神,示意我继续说下去。
“shell是一个命令解释器,他是用户和Linux内核之间的接口程序,架起了人类和机器之间沟通的桥梁。用户输入的指令都将由shell解释,然后再传输到Linux内核。”我顿了顿,“但是shell本身的指令集是有限的,他需要更多命令来拓展自己的能力,这些命令是存放于文件系统中的,比如热情的touch、严肃冷漠的rm等等。只是对于用户来说,这些都是抽象的、无法感知的。”
“那么,shell如何认清自己的能力范围呢?或者说,他如何判断自己什么能做,什么做不了?”布莱恩微笑着说。
这可难不倒我,我早就对自己的能力了如指掌。我说:“shell首先会分析用户输入的指令,检查它是不是内部指令。如果是,那就继续执行。如果不是,他将检查文件系统中$PATH下是否有匹配的命令程序,如果还是没能找到,他将通过我显示一条错误信息给用户,提醒他们是不是输入错误。毕竟,人类可不像我们,老是容易马虎。”
“哈哈,你说得对,人类永远无法像机器一样精密。”布莱恩自嘲道,“来谈谈你的兄弟姐妹吧,初学者们常常将他们混淆。”
“我们手足情深,但我最思念的还是其中两位。老大哥sh是UNIX上最初使用的shell,他是个编程能手,但是不太善于和人交流,所以sh在用户交互上有些笨拙。接着C shell诞生了,他弥补了老大哥sh在用户交互上的一些问题,比如支持了命令补齐等功能,但是接口设计不够优雅灵活,倒是他的语法和C语言很相似,于是大家都叫他C shell。”
“那么你呢,来谈谈自己吧。”布莱恩掩饰不住自豪的语气,就像是在review他为我写过的每行代码一样。
“我嘛,已经成为了Linux系统默认的shell,应该是现在世界上最流行的shell”,说完这话,我感到有点不妥,可能引起程序员的纷争,于是连忙又补上,“之一”。
“我是对大哥sh的拓展,并向后兼容。我的编程接口十分灵活与强大,这点继承了sh的意志。同时,我的用户交互友好,比如我能够支持命令补齐、通配符、历史记录、重定向等功能,而且我支持提示符的用户个性化自定义呢!”说到这里,我显得有些激动。
“我其实最想向大家介绍的是我的‘管道’,它能够将一些命令组合起来,犹如将水管拼接起来,第一根水管的输出即是第二根水管的输入,这样将不同的命令拼接起来,就能处理复杂的任务了,这真是太酷了!”
布莱恩见我如此兴奋,慢悠悠地说:“口说无凭,你能给大家演示一下吗?”我知道,其实他更想向大家展示自己的作品。
比如,我先使用touch test.txt
命令创建了一个文件,然后使用vim test.txt
进入这个文件进行编辑。当然,在这个过程中,你可以试试命令自动补全这个功能,比如,当你输入:vim t,然后敲击Tab键,命令将自动补齐为:vim test.txt。这很酷吧?
进入test.txt,我编辑了三句话。
hello world.
hello man.
i'm detective bash.
~
~
现在,让我们试试“管道”,管道符是“|”,对,就在你Enter键的上方。我输入cat test.txt | grep "hello" | wc -l
,这段指令是什么意思呢?cat
是列举文件内容,grep
是用来查找含有“hello”字符串的行,最后wc -l
是计算出行数。
$ cat test.txt | grep "hello" | wc -l
2
很方便快捷,不是吗?试想,假如你要在Windows平台上获取这个结果,可能就会束手无策了。当然,值得一提的是,Windows大佬也十分优秀,大家各有所长,不应该将一切任务都寄希望于Linux,以此来标榜脱离Windows。
我的简短自我介绍结束了,“此外,若想了解命令的介绍和详细用法,可以使用help
和man
来寻求帮助。更多使用方法和原理,则需要用户去尝试探索。”我补充道。
$ help pwd
pwd: pwd [-LPW]
Print the name of the current working directory.
Options:
-L print the value of $PWD if it names the current working
directory
-P print the physical directory, without any symbolic links
-W print the Win32 value of the physical directory
By default, `pwd' behaves as if `-L' were specified.
Exit Status:
Returns 0 unless an invalid option is given or the current directory
cannot be read.
我只看到布莱恩向我投来肯定的目光,梦便消逝了。原来,我被唤醒工作了,在这新的一天里,会有奇妙的事情发生吗?
写在最后:
关于写技术类型的文章,我一直有一个想法,就是去设立一个世界框架,然后去填充和丰富它。
他首先抛给我两个问题:1. 你文章的受众是谁? 2. 你想要给他们带来什么,你自己想要得到什么?
以上两个问题,我觉得有写作意向的读者都可以自己琢磨一下,因为人真的很容易陷入“自嗨式”写作,即使没有这样的倾向,如何提升文章的质量以及给读者传递更多的价值,也是我需要考虑的。
后来他聊到了自己一路写作过来的心路历程,其实仅仅是聊天,他也没有刻意给我灌输什么,但这个过程中,我的思路开阔了很多。他给我的建议是“不要着急,慢慢来”,是的,如果我如果真的喜欢写作,想要在这条路上走得更远些,暂且需要放缓脚步,好好去思考。
如果你有什么想说的,欢迎留言,也可以在微信与我交流。
推荐阅读:
长按二维码关注
以上是关于编程迷踪 : 第一章 - 侦探bash登场的主要内容,如果未能解决你的问题,请参考以下文章
linux shell编程bash编程shell教程bash教程shell文档bash文档shell脚本bash脚本教程第一部分:绪论