Chinaunix首页 | 论坛 | 博客
  • 博客访问: 324975
  • 博文数量: 82
  • 博客积分: 1530
  • 博客等级: 上尉
  • 技术积分: 771
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-16 03:44
文章分类

全部博文(82)

文章存档

2011年(6)

2010年(76)

我的朋友

分类: LINUX

2010-05-08 03:48:04

命令行处理:
下面介绍一个shell命令的处理过程。

1、将命令分成由固定元字符集分隔的记号:SPACE、TAB、NEWLINE、;、(、)、<、>、|和&。记号类型包括单词、关键字重定向符等等。

2、检测第一个记号,查看是否为不带引号或反斜杠的关键字。如果是一个开放的关键字,如if、function、{或(,则命令实际上为一复合命令。shell在内部对复合命令进行处理,读取下一命令,并重复这一过程。如果关键字不是复合命令起始字符串,而是then,else,do或类似于fi或者done的结束关键字,则shell给出语法错误信号。

3、依据别名列表检查每个命令的第一个关键字,如果找到相应匹配,则替换其别名定义,并退回第一步。否则进入第四步。该策略允许递归别名。

4、执行大括号扩展。

5、如果~位于单词的开头,使用用户的主目录替换。

6、对任何以符号$开头的表达式执行参数替换。

7、对形式$(string)的表达式进行命令替换。

8、评估形式为$((string))的算术表达式。

9、把行的参数、命令和算术替换部分再次分成单词,这次使用$IFS中的字符作分隔符,而不是步骤1中的元字符集。

10、对出现的*、?和[/]对执行路径名扩展,也称为通配符扩展。

11、查找其源代码,使用第一个单词作为命令,首先是一个function命令,然后是一个内置命令,然后是$PATH内目录里的文件。

12、设置完I/O重定向和其他操作后执行该命令。

(悲剧呢,看的挺头晕的!!!)


给一个直观一点的例子:
alias ll="ls -l"
假定文件.hist537存在于用户alice的主目录下/home/alice,有一个双美元变量$$,值为2537。(双美元特殊变量后面会介绍)
ll $(type -path cc) ~alice/.$(($$%1000))

运行过程如下:
1、将输入分隔成单词
2、ll不是关键字,步骤2执行为空
3、用ls -l替换其别名ll。然后shell重复步骤1至步骤3.步骤2将ls -l分成两个单词。
4、此步骤为空
5、将~alice扩展成/home/alice
6、将$$替换成2537
7、对“type -path cc”执行命令替换
8、对算术表达式3537%1000求值
9、该步骤为空
10、用文件名替换通配符扩展.*537
11、在/usr/bin中找到命令ls
12、运行/usr/bin/ls,带有选项-l和两个参数


引用:
1、单引号。绕过前10个步骤。注意,不能把单引号放在单引号之内,及时前面加反斜杠也不行。例如:对
'abc'\' 'def'求值为abc' def
2、双引号。绕过步骤1到4,步骤9和步骤10.双引号内的单引号是没有用的,可以被直接输出,但可以在双引号内包含双引号。

command、builtin和enable:
命令查找的默认次序是函数、内部命令、脚本和可行代码。有三个内置命令可以覆盖该次序:command、builtin和enable

command选项
-p   使用PATH的默认值,这样command会忽略PATH下的目录
-v   打印出调用command的命令或路径名
-V   比-v更详细
-    关闭进一步选项检查

builtin类似于comand,但更加严格,只查找内置命令,忽略函数和PATH上的命令。

enable可以使shell内置命令可用或屏蔽。
enable选项:
-a   显示所有命令以及是否可用
-d   删除使用-f载入的命令
-f filename  从共享对象filename中载入一个新命令
-n   屏蔽一个或者命令列表
-p   显示所有命令列表
-s   限制输出为POSIX“特定”命令

eval
有点复杂,不想看

学习make命令。。。。。

解决下面的习题,那就是bash高手了:::::!!:!:!:!:

以后补上!!!!!
阅读(1142) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~