在unix中,shell命令行的解释过程是个非常复杂的过程,从用户命令输入,到最终的标准输出或重定向到文件,整个过程大约分为12个步骤。按照shell的执行顺序可列举如下:
1、读取命令行;
2、回显输入的命令(如果用户设定了命令回显标志);
3、变量替换;
4、命令替换;
5、I/O重定向(Bourne shell);
6、IFS处理;
7、扩展元字符以生成文件名;
8、删除引号引用;
9、跟踪执行过程;
10、I/O重定向(Korn shell);
11、环境处理;
12、执行命令。
-
一、读取命令行
Shell解释命令的第一步是读取命令行,从命令语句中解析出空格和制表符。命令行可以来自terminal,也可以取自一个普通的文本文件(如shell脚本)
读取命令语句时,直至遇到一个分号“;”、后台进程执行符合“&” 、逻辑与“&&” 、逻辑或“||”或一个换行字符时,整个读取过程即告结束。如果读取的是一个结构语句,如if/then、for或while等,shell将会完整地读入整个结构语句。
在读入一条命令或结构语句之后,shell将会命令语句进行语法分析,把命令语句分解为一系列单词或关键字。默认情况下,shell假定每个单词都是由空格或制表符分隔,由一系列连续的字符组成的。Shell从命令语句行首的第一个字符开始解析,直至行尾结束,依次找出一系列单词,包括由“<” 、“>” 、“|” 、和“^”等特殊字符组成的单字。不管IFS变量的设置如何,这个解析过程总是如此处理。至于如何处理IFS变量,则是另外一个解析步骤。
在这一步骤中,ksh还要处理别名替换和~扩展。
-
二、回显输入的命令
命令行解释的第二步是确定命令回显标志是否已经设置。如果已经设置,shell将把读入的命令或结构语句回显到用户终端的标准错误输出。
子进程可以继承父进程的运行环境或打开的文件等,但无法继承命令回显标志。如果特定shell的回显标志已经设置,shell也无法回显由子进程处理的命令。
-
三、变量替换
命令行解释的第三步是变量替换,包括位置参数替换和特殊替换。
变量替换表达式是由“$”与后随的变量名或参数名构成的、如$var。变量名或参数名
也可以用“{}”括起来,如${var}。引用时,通常需要在变量替换表达式前后加双引号,如fname=“${var}”。但在变量包含若干单词,而shell又需要处理每一个单词时属于例外。
-
四、命令替换
命令行解释的第四步是命令替换。命令替换表达式是由反向单引号“`”或$(…)括住的命令语句,表达式的值则是