命令行处理:原理、技巧与实践
1. 命令行处理基础
在日常使用中,我们常常通过命令行与系统交互。命令行处理是一个复杂但有序的过程,它涉及多个步骤,以确保命令能够被准确解析和执行。
当shell从标准输入或脚本中读取一行时,这一行被称为管道(pipeline),它包含一个或多个由零个或多个管道字符(|)分隔的命令。对于每个读取的管道,shell会将其拆分为命令,设置管道的输入输出,然后对每个命令执行以下步骤:
1.分词:将命令按固定的元字符(如空格、制表符、换行符、;、(、)、<、>、| 和 &)拆分为标记(tokens)。标记类型包括单词、关键字、输入输出重定向符和分号。
2.关键字检查:检查每个命令的第一个标记是否为无引号或反斜杠的关键字。如果是起始关键字(如 if、function、{ 等),则该命令是复合命令,shell会为复合命令进行内部设置,读取下一个命令并重新开始处理过程;如果不是复合命令的起始关键字,shell会发出语法错误信号。
3.别名替换:将每个命令的第一个单词与别名列表进行匹配。若找到匹配项,则用别名的定义替换该单词,并回到步骤1;否则,进入步骤4。此机制允许递归别名,也可定义关键字的别名。
4.波浪号替换:若单词以波浪号(~)开头,将其替换为用户的主目录($HOME);若为 ~user 形式,则替换为该用户的主目录。此外,~+ 会被替换为当前目录($PWD),~- 会被替换为上一个目录($OLDPWD)。
5.参数替换 <