《Linux嵌入式实时应用开发实战(原书第3版)》——3.7 shell

本节书摘来自华章计算机《Linux嵌入式实时应用开发实战(原书第3版)》一书中的第3章,第3.7节,作者:(美)Doug Abbott 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.7 shell

Linux系统启动最后所做的事情之一是调用叫做shell的命令解释程序。它主要的工作是解析你在控制台输入的命令并执行相应的程序。但是shell不仅仅是一个简单的命令解释器。它包含了自己的一个功能强大的表述性解释编程语言,通过整合shell脚本语言和现有的实用程序,使无需写一行C代码就生成一个非常成熟的应用成为可能。事实上,这就是常规的UNIX编程的指导思想。从一组简单的实用程序开始,通过shell脚本语言将它们链接起来。
shell脚本语言包括通常的循环、测试、函数等编程结构。但是也许shell包中最灵活的诀窍是“管道”的概念。这是一种使数据从一个程序流向另一个程序的机制。这个比喻很形象。一个程序将几个字节从管道的一端输入,同时另一个程序从管道的另一端取出这几个字节。
多数的Linux/UNIX 实用程序从一个叫“stdin”的默认设备接收它们的输入。同样,它们输出到一个叫“stdout”的设备。任何错误信息都写到“stderr”里。通常,stdin 是键盘,而stdout和stderr是显示,但是我们可以简单地认为stdin和stdout为一个管道的两端。
stdin和stdout可以重定向,例如,我们可以将输出发送到一个文件或从文件接收输入。在一个shell窗口,试着输入不带任何参量的命令cat。cat在所有的UNIX实用程序里也许是最简单的,它所做的就是将stdin一行一行地复制到stdout。当你输入一个没有参量的cat命令时,它会一直在stdin处等待键盘输入。输入一行文本,它就会发送一行到stdout——显示器。按可以退出程序。
现在试一下:

cat>textfile

输入一行文本。这次你在显示器上看不到文本的重复,因为操作符“>”将stdout重定向至文件textfile。输入几行,然后按退出。
本练习的最后一步是:

cat<textfile

瞧!之前你通过命令创建的文件显示到了屏幕上,因为操作符“<”将stdin重定向到了textfile。cat实际上执行了一个快捷方式,所以如果你输入一个文件名作为一个命令行的参数,没有操作符<,那么这个文件就成了输入文件。如下:

cat textfile

但是管道的实际作用是操作符“|”,它将一个程序的stdout输入到另一个程序的stdin。在我做上面的练习时,创建了一个textfile,包含:

this is a file
of text from the keyboard
现```  
在如果我执行

Cat textfile | grep this

我就会得到

this is a file

你可能猜到了,grep是一个滤波器。它用它的命令行参数去处理stdin的输入数据流。包括参数文本的行可以通过并传递到stdout,其他的行就被简单地忽略了。在这里cat的输出成了grep的输入。
在典型的UNIX风格中,grep代表全局全则表达式。正则表达式实际上是一种强大的机制,一种用于搜索文本的脚本语言。grep包含正则表达式的语法。
shell脚本和makefiles广泛使用了重定向和管道。
一些其他的shell特性也值得在此作一个简单的介绍,因为它们可以节约很多打字的工作。shell可以保留命令行记录,你可以通过向上箭头键上翻得到之前的命令。这就允许你重复之前的任何命令或稍加编辑形成一个新的类似的命令。使用history命令可以输出系统或任何子系统累计的命令历史记录。历史记录保存在你本地目录的文件.bash_history里。
图3-11显示的是我系统里的history命令的最近几行。要重新执行这个列表里的任何命令,只要简单地输入“!”和在历史记录列表里的命令号码即可,如下:

将重新执行history命令。
<div style="text-align: center">
 <img src="https://yqfile.alicdn.com/4c16205b9940e5ceb8741b15f08c7939634dad9c.png " >
</div>


另一个很有用的特性是自动补全,这是一个帮你完善文件名参数的功能。比如,我想执行:

Cat verylongtextfilename

我可以试着输入

Cat verylong

只要文件名的其余部分在当前目录里是独一无二的,则shell将自动补全名字,这就为我解决了输入整个文件名的麻烦。如果找不到单一的匹配项,shel就会发出警报声,那么你需要再多输入一点直到其余的部分是独一无二的。
最后,“~”代表本地目录。所以从文件系统的任何地方,你都可以执行cd~回到本地目录。
有几个常用的shell程序,尽管语法和特征的细节不同,但它们都具有同样的基本功能。最流行的是:
- Bourne again shell——bash。bash是Bourne shell即sh的化身,最初是Stephen Bourne写的,随UNIX版本7发行。在多数Linux发行版本中都是默认的shell。你应该使用它,除非你对使用其他shell有其他的原因或强烈的喜好。
-  Korn shell——ksh。20世纪80年代早期,由David Korn 在美国电话电报公司的贝尔实验室开发。它具有很多比bash更高级的编程功能,但仍然保持了后向兼容性。
- Tenex C shell——tcsh。Cshell即csh的继承者,本身是Bourne shell的前身。Tenex是一个操作系统,它是tcsh的一些特性的来源。
- Z shell——zsh。作为Bourne shell的一种扩展shell有大量的改进,包括bash、ksh和tcsh的一些最有用的特性。

shell编程本身就足以用一本书去介绍,这样的书有很多。我在Amzaon.com上搜索“shell 编程”时,就找到了189条信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值