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

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
现```
在如果我执行
```javascript
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命令。

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

Cat verylongtextfilename

我可以试着输入

Cat verylong<tab>

只要文件名的其余部分在当前目录里是独一无二的,则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条信息。

时间: 2024-12-30 18:57:51

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

《Linux嵌入式实时应用开发实战(原书第3版)》——1.5 开源协议

1.5 开源协议 多数软件终端用户协议都明确限制了你只可以使用协议范围内的功能.典型的限制条件是不允许复制或重新发布.你通常会被警告不要试图对软件进行"逆向工程". 相反,开源协议是只要你愿意,就允许使用.修改和复制授权的软件.和权利相伴的是义务.如果你修改并发布了一个开源协议内的软件,你就必须将修改后的源代码也纳入该框架.你的修改就成为"派生的工作",也在该协议的范围内.这就允许其他使用者更好地理解软件,并按他们的意愿做出更多的修改. 开源协议也叫"公共

《Linux嵌入式实时应用开发实战(原书第3版)》—— 2.4 DVD 还是激活CD

2.4 DVD 还是激活CD 多数的Linux发行版至少可以通过三种途径获得:DVD.CD包(目前最多包含6张CD)或者一张激活CD(Live CD).一张激活CD就是一个最小的可引导Linux系统,可以不用安装Linux就让你有机会体验新的发行版.当然,你不能保存任何数据或修改配置.每次启动它都会恢复到默认配置. 激活CD提供的一个选项是安装发行版.当你选择这个选项时,它将运行和你使用DVD或完整的CD包同样的安装过程.不同之处在于安装包是来自网络而不是来自物理介质.

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

前 言 使用minix的朋友们,大家好! 我正在为386(486)AT系列编写一个(免费的)操作系统(这仅仅是业余爱好,不会太大,也不会像GNU那样专业).我从4月份开始酝酿,现在快准备好了.我希望得到任何关于minix的反馈,包括你们在使用过程中喜欢和不喜欢的地方.因为我的操作系统和它多少有点类似(比如文件系统具有相同的物理布局(出于实用的原因)). 我目前已经移植了bash(1.08)和gcc(1.40),而且进展好像很顺利.这意味着我将在未来几个月内把这个系统推向应用,所以我想知道大多数人

《Linux嵌入式实时应用开发实战(原书第3版)》——1.3 为什么Linux适用

1.3 为什么Linux适用 Linux模仿UNIX的基本架构,在其基础上发展成为一个通用的操作系统.没有人认为UNIX适用于嵌入式或实时操作系统(RTOS).它太大了,占用太多的资源,而且其调度原则是基于顺序而不是优先级.因此,简而言之,它与嵌入式操作系统的要求完全是背道而驰的. 但是Linux有UNIX系统的早期版本所欠缺的几样东西.它是免费的,而且你可以得到源代码,并且有一个拥有大量热情的Linux开发者和使用者的大社区.你在使用中所面临的问题总有人正遇到或曾经遇到过,所有这些都在网络上,

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

1.4 哪里用嵌入式Linux 任何地方都在用.2005年7月,LinuxDevices.com网站列出了超过300个运行Linux的商业产品.它们包括手机.个人数字助手(PDA)及通过路由器和网关使用的其他手持设备:精简客户端.多媒体设备.电视机顶盒.机器人和加固的VMEbus:适用于军事和控制应用的机箱.这些只是LinuxDevices网站的编辑们正好知道的产品.首个或许也是最知名的应用嵌入式Linux的家庭娱乐设备是TiVo个人录像机,当它在2000年首次出现时,就引发了电视业的革命.Ti

《Linux嵌入式实时应用开发实战(原书第3版)》——3.5 Linux文件系统

3.5 Linux文件系统 Linux文件系统在很多方面与Windows PC或Macintosh(苹果公司生产的)上的文件系统类似.它是一个等级系统,允许你在"/"标识的根目录下创建任何数量的子目录.和Windows中一样,文件名可以很长.尽管如此,Linux和多数类似UNIX的系统一样,文件的扩展名--文件名中"."后面的那部分--不像它们在Windows中那样有意义.例如,Windows中的可执行文件的扩展名为".exe",但是Linux中

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

1.6 资源 embedded.com--<Embedded Systems Design>杂志的网站.这个网站并不是专门针对Linux的,但是作为一个更通用的信息工具,对于解决嵌入式系统问题是很有用的. fsf.org--自由软件基金会. gpl-violations.org--通用公共授权侵权项目,宗旨是针对GPL"提高对过去和现在的侵权的认识",据网站所述,它"仍然只是一个人的努力". keegan.org/jeff/tivo/hackingtiv

《Linux嵌入式实时应用开发实战(原书第3版)》——2.5 安装过程

2.5 安装过程 不管你选择的安装方案或安装介质是什么,安装过程是大致相同的.这里描述Fedora的安装,但是安装其他的发行版也是类似的: 下载发行版介质(见2.6节).这可能是一个.iso文件.一个DVD或激活 CD的精确映像. 将.iso文件写入到相应的物理介质上.你需要一个磁盘烧写程序将 .iso文件转移到物理介质.在虚拟机的环境中,你可以直接挂接.iso文件,就和操作一个DVD或CD一样. 从安装介质开始启动计算机或者单击激活 CD中的安装图标.你可能需要配置PC的BIOS为从光驱启动.

《Linux嵌入式实时应用开发实战(原书第3版)》——3.8 获得帮助

3.8 获得帮助 UNIX/Linux系统的官方文档是一组叫"man pages"的文件.man是手册(manual)的简称.man pages可以通过如下的shell命令访问: man cp 这条命令可以得到关于shell复制命令的帮助.试一下,在shell提示(prompt)里输入man man 可以对man命令有更多的了解.man在屏幕上一次显示一页,在最下面的一行用一个":"提示.要看下一页,就按键.要在到达最后一页前退出man,就输入q.你也可以在man页