Shell的用武之地

软件的发展速度,超过了任何一个行业。软件的从业人员节节攀升;软件的使用人员,也深入到了乡村(都使用了智能手机来看节目,聊视频)。

1 Linux与Shell

作为软件产品的使用人员,我们逃不开Windows;作为软件产品的工作人员,也躲不过Linux(类Unix系统,Unix、Linux,简称Linux)。

成万上亿的各种Linux系统,及系统的贡献者,隐藏在信息时代的后台,辛苦劳作,默默奉献。不为名利,只为自由而战。真的很棒。

Linux系统,是计算机世界中的宝藏,等待着有心人的挖掘和分享:

1)最神秘是Kernel,她填补了开源世界最核心的部件,之后开源软件才能自己独立玩了;

2)最多彩是DeviceDriver,她满足了创造的欲望,专业、业余的DIYer,都可以为开源软件添砖加瓦了;

3)最亲密是Shell,她提供了一个“虫洞”,我们可以通过她,进入神秘多彩的计算机时空,体验高维度生物的行为思想(现实时空,也许就是高维度生物的游戏场所);

4)最暖心是各种Tools,你找到她们,她们就会给你惊喜或沉溺;你找不到,就自己苦逼或幸运吧。

本次,我们主要聚焦在Shell。Oh, My precious.

2 Shell简介

Shell是一个命令解释器。用户通过Shell,可以使用和控制Kernel、Device、Tools的资源。

(按照《魔戒》的说法,是:“Linux系统太复杂,于是为玩家提供各种游戏攻略,天下戒指一十七,Kernel得其三,神秘、聪慧而长生;Device得其五,多彩状况,也不乏奇淫技巧;Tools得其九,最多也最贪心,生得多死得也快。戒指太多不知道怎么戴,又弄了一个至尊戒Shell。至尊戒、御众戒,这是一个光明的至尊戒,而不是邪恶的;我们不是去抵制她、毁灭她,而是要经常使用她、亲近她;这样能通过至尊戒,发挥其他戒指的更大威力。”)

shell的用武之地,个人总结有三点:

1)快速实现软件原型

2)非交互式的自动化使用

3)集成实现更高级功能

以下逐点展开描述。

2.1 快速实现软件原型

在管理中,我们经常听到类似的化:“方向比速度更重要,选择比努力更重要”。软件工作也一样:先满足正确性,否则性能没有意义(其实快还是有意义的,能很快知道错了)。

我们可以通过一个简单但实际例子来比较一下:把若干文件中固定格式的16进制数,转成10进制数另存,好方便人类查看。

有几种方法可以一试:

1)打印出来,手工转换,用笔标注

2)使用C,写个Command程序

3)使用MFC,写个GUI程序(可以补充其他语言对比)

4)使用shell,写个脚本

第1)种方法,正确性靠转换人保证(我想起一个电视中揭露的游戏“交20押金,从1写到500,全都正确给价值好几百的礼品或现金,错误则没收押金”,有人靠这个能挣钱养家糊口的)。时间基本和字节数成正比(假设转、写1秒1数)

第2)种方法,需要写源码,实现文件读写、内容按规则读取、字符串数字转换、数字进制转换等功能,然后编译、调试,完成程序后,在命令行调用。正确性靠人设计、通过数据来保证。时间包括写程序、调用文件、执行三部分,主要时间在“写程序”,其次在“调用文件”,“执行时间”最少

第3)种方法,和第2)种类似,只是多了GUI的设计、实现,完成程序后,可以用鼠标操作。时间也类似,只是有“命令行”和“GUI鼠标”的操作时间差异

第4)种方法,和第2)种相同,只是用脚本实现,不用编译。时间的差异有两点:“写程序”和“写脚本”,“编译程序的执行”和“脚本程序的执行”

具体选取哪个方法,要看实际场景。

1)如果只有100个数,人工方法最靠谱人工,什么写程序都是浮云。但电子信息的特点之一:信息特别多

2)如果用GUI实现,用得会很爽,鼠标指指点点搞定。开发时间则是最长的,而且一定要有人触发。如果每天都要操作,这个人会觉得枯燥,说不准忘记了。电子信息的特点之二:开发人员的数据处理,比终端用户多得多。这个进制转换的例子,其实就是开发人员的需求(终端用户,也许根本不知道16进制和10进制的区别。“我们连12点和0点都区不了”),他们在程序调用上,并不是电脑白痴,他们不喜欢当“白痴”

3)用command实现,不开发GUI(不用做GUI,开发很开心,因为美工实际是个艺术活,而不是技术活)时间少,主要时间是调试、逻辑差错时间。可以把执行命令复制下来,要处理就执行一下,方便快捷,但还是要操作。电子信息的特点三,信息随时来;软件开发特点一:调试、差错时间,比编码时间多得多

4)用脚本实现,没有GUI,代码比c少,直接运行调试。如果定点到,或数据多,可以定时执行,无人值守。完美。Oh, My precious.

当然如果要实时转换,脚本速度达不到,耗时部分可以调用已写好的Tool,或者自己实现这个Tool。(真正要实时转换,没有Shell,我们还有写一个定时程序来调用。时间又耗费了)

个人用脚本实现,代码行数54,还包括8行注释,8个空行。实现花了45分钟(包括上网查属性,写word使用说明)。Oh, My precious.

其实,我们有很多快速原型或最终产品的例子:

1)matlab快速实现算法效果

2)搭建虚拟机

3)互联网后台应用

2.2 自动化使用

自动化的概念,从软件角度定义是批处理,无人值守,定时执行。从广义角度,不需要人参与,或者不需要我参与的,都可以归属广义的自动化。在现代生活中,自动化在衣食住行用各个方面,已经无孔不入(而且这也是工业社会进步追求的主要目标之一)。随便就能列出一大把:

先从住家水电卫厨开始:自来水,饮用水,电水壶,保温杯;电、电灯、电饭煲、电磁炉、榨汁机、豆浆机、电冰箱、电视机、空调、电风扇、洗衣机;下水道,天然气,罐装煤气,热水器,浴霸,小闹钟,手表,电脑。。。当然,还有最重要的手机,网络(广义上讲,自动化的一切,就是网络的体现)

再看看交通:自行车、电动车、公交车、私家车、高铁、轮船、飞机、火箭。。。

吃穿就不用多说了:快餐(深圳最发达产业之一)、大排档、酒楼、私家菜。。。;对于穿,从出身到现在,我们有自己做过一件衣服吗?

最近几十年的计算机革命,最近十几年的互联网革命,最近几年的物联网革命,则是计算机、软件、网络、智能设备相关的自动化典型应用。客户越来越懒了,工作人员也是如此。

问题来了,作为工作人员,或者细分到软件从业人员,你的工作、或你的产品,多少自动化了?

Shell做自动化的能力、成果、方便性,在所有语言中首屈一指(后续会逐渐整理一些具体应用,这里只概述),是资深软件从业人员的必备工具(犹如木匠的电动锯,医生的病历本,律师的档案袋)。

Linux启动中,各种服务的自动开启

清除过期文件、机器老化、自动化测试等等的无人值守执行

软件开发的持续集成,提交代码后,迅速编译、打包、运行测试,给出反馈

各种服务器、数据库的维护、备份

。。。

绝大多数场合,我们都是终端用户(衣食住行用),按黑盒子方式使用;偶尔一个微小的点(工作行业的产品),我们是研发生产人员。有时候,我们没有切换角色和思维,把盒子生产的要求点和标准,想得过于简单。

相对终端用户(交互式、黑盒子方式使用,主要关注功能点、性能点、界面、操作流等),研发生产人员更要掌握(制造黑盒需要更多工具,盒子包括很多非用户需求:如快速调试、快速验证、快速发布,系统集成,运行资源监控、批量生产、异常现场信息收集、快速升级)。

如果你要加强工作的自动化能力?Shell真的很不错。这是大家对Shell高手,敬仰之情如滔滔江水,连绵不绝的原因。Oh, My precious.

2.3 集成实现更高级功能

当今的人类世界,除了艺术品还是“单兵作战”模式,如哲学思想、绘画、书法、音乐等等(主要工作是单兵,大量的辅助还是被自动化了。像李宗盛这种,唱歌用自己做的吉他,做吉他用自己种的树,少了);其他工艺品都切换到了“团队作战”模式,如出书、画展、演唱会、做手机、做App产品等等(还是需要单兵英雄,但是大量的工作需要支持)。

而且,“团队作战”的模式,已经切换到“特种部队”这种快速响应模式,通过“少部分外部执行者(前台信息收集、决策) + 资源网络支持(后台数据处理、执行)”。

这种模式能粘合、组装,利用已成熟工作的系统资源,集成实现更高级的目标(也可以叫组装、组合能力)。集成能力像胶水、螺丝、铆钉、绳子、包装袋、容器。。。

一个简单比喻(可能不恰当),小时候过节时发糖果,我们的小手都抓满了,结果没有几颗。于是,我们先抓一些放在上衣口袋,再放一些在裤袋,然后再抓满,很满足。如果我们自己背个书包来装,估计爸妈就要发狂了(小时候一直没有想到过)。

软件开发中,相对硬件、其他有形产品,更容易集成(也许是“需求爆炸”的愿意之一)。Booch在《面向对象的分析与设计》中写到,软件开发团队的任务,是设计一种假象,对用户掩盖复杂性(专业术语是封装)。当然开发人员,必须承受其背后的复杂度。

软件集成了硬件、固件、结构;应用程序集成了操作系统、驱动、网络;Shell,则为快速实现更高级的应用程序,提供了“特种部队”的集成能力、运行环境。

Oh, My precious.

3 学习难度

关于学习,有几点说明:

计算机是一门实践学科,光说不练假把式。

学习计算机语言,比人类自然语言容易得多。

学习Shell,比C++容易得多,比C也容易,比Python有难度(学会Shell,再学Python就容易了)。

学习Shell不要纠结于语法,记住她的用武之地。

多在互联网上查,解决问题会更快。

你解决了问题,可以在互联网上风险,让后来人更快。

时间: 2024-10-08 19:35:08

Shell的用武之地的相关文章

shell脚本中if流程控制语句的应用

上篇关于测试语句的使用规则及相关使用方法,如果仅仅孤立使用时很难有其用武之地,当然在shell脚本中其实不可能孤立存在的,只有与条件语句和控制语句等搭配使用才能使其功能得到最大限度的体现,因此在日常使用中,其功能不容小觑. 一.控制流程 if控制流程可分为但分支if语句和多分支if语句,其使用语和C语言中有很多相似之处,具体用法如下文所述. 1.1但分支if语句结构: 1.2基本语法     if 条件        或    if 条件:then   //分号表示两个命令写在一行并不相互影响,

Shell 命令--文件创建、搜索命令--总结自《Linux Shell 脚本攻略》

(一)文件创建命令 1.touch命令 例如:touch abc命令在本地目录中创建了一个名为abc的空文件 2.cp命令 cp命令允许我们把一个文件的内容复制到同名或不同名的文件中,复制得到的文件可以在任何目录.使用cp命令的一个风险是它会在不提示用户的情况下很容易覆盖掉不同目录中的文件 -r选项支持递归复制.例如:cp -ar /usr/share/doc/. /doc/ 将复制源目录中所有子目录以及相关文件 3.mv命令 mv命令实质上市给文件贴上不同的标签,例如:mv file1 fil

SHELL笔记(二)

1录制并回放终端会话 1.1录制终端 $ script -t 2> timing.log -a output.session commands; ...... ....... exit //文件timing.log用于保存时序信息:文件output.session用于存储命令输出. 1.2回放终端 $ scriptreplay timing.log output.session 2.文件查找和文件列表 2.1列出当前目录及子目录下所有的文件和文件夹 eg: find /home/mapgoo/s

新手学Linux,linux运维之初识shell

接触linux是在大二的时候,那时候迷上了嵌入式linux,把电脑换成了linux系统,学习linux基础知识,学习linux命令,学习shell,泡论坛,就这样慢慢的平时工作学习都可以使用linux系统完成了.到了毕业工作的时候,正式开始android开发,使用的正是ubuntu系统,多亏上学时候的linux基础知识,工作的时候也算得心应手. 随着工作时间的增长,使用linux系统也越来越熟练,慢慢的发现做开发已经离不开linux了,离不开linux里面的shell了,使用shell命令的工作

【Linux系列】【基础版】第四章 Shell基础之正则表达式

4. Shell基础之正则表达式     4.1 正则就是一串有规律的字符串         4.1 grep              4.1.1 格式: grep [-cinrvABC] 'word' filename             4.1.2 -c //count,表示行数             4.1.3 -i //不区分大小写             4.1.4 -n  //显示行号             4.1.5 -r  //遍历所有子目录             4

linux Shell函数

Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 1 2 3 4 function 函数名() {     语句     [return] } 关键字function表示定义一个函数,可以省略,其后是函数名,有时函数名后可以跟一个括号,符号"{"表示函数执行命令的入口,该符号也可以在函数名那一行,"}"表示函数体的结

Shell实现跳板机,为什么用跳板机

整理自:http://blog.chinaunix.net/uid-22101889-id-3167454.html 注意:请谨慎使用,到现在为止,使用了,我还没找到改回去的方法. 1.     问题 第一.很多大公司的服务器都不允许直接登录,而是通过一个跳板机才能登录过去.在跳板机中,通常只能执行几个少数命令(如SSH),而其他命令是不允许执行的,那么怎样才能实现这个功能呢? 第二.一些小公司,由于服务器比较少,不需要什么跳板机之类的说法,公司的开发运维人员加起来也就那么十几二十人,通常大家都

linux shell基础语法

1.第一个Shell脚本 打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了. 输入一些代码: #!/bin/bash echo "Hello World !" "#!" 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell.echo命令用于向窗口输出文本. 运行Shell脚本有两种方法. 1.1作为可执行程序 将上面的代码保存为t

shell中test命令方法详解

test命令用法.功能:检查文件和比较值 1)判断表达式 if test  (表达式为真) if test !表达式为假 test 表达式1 –a 表达式2                  两个表达式都为真 test 表达式1 –o 表达式2                 两个表达式有一个为真 2)判断字符串 test –n 字符串                                   字符串的长度非零 test –z 字符串