Linux Bash Shell学习(二十):命令行处理
2010-03-22 09:35
363 查看
本文也即《Learning the bash Shell》3rd Edition的第七章Input/Output and Command-Line Processing之读书笔记之四。我们的目的是把书读薄。我们将审视Linux系统如何解析bash。
第一步骤
:将命令分给为token,根据空格,TAB, NEWLINE, ;, (, ), <, >, |, 以及 &。
第二步骤
:检查第一个token是否一些关键字,是否是引号,’/’是否是一个需要组合的符号,例如’{‘或者’(‘,看看是否需要读取下一行命令,如果需要,回到第1步骤,如此循环,直到获取完整的命令。如果不是组合命令的开始,而是其他关键字,例如结束fi等,报告语法错误。如果不是这些关键字,进入第3步骤。
第三步骤
:根据alias列表检查命令的第1个tocken,它取得alias的对应,重新回到第1步骤。回到第一步骤,允许alias的嵌套,就A表示B,B表示C,也允许alias表示一些整合命令的开头。
第四步骤
:大括号解析。例如将a{b,c},解析为ab ac。
第五步骤
:波浪号(~)解析,如果在一个词的最前,解释为用户的$HOME目录路径。
第六步骤
:参数解析。如果词开始为$,解析这个参数变量。
第七步骤
:是否因$的解析而产生命令替换。
第八步骤
:对$((string))的格式进行数学运算。
第九步骤
:经过第5步骤开始的几个步骤,重新将词分离,使用$IFS作为分隔符号。
第十步骤
:路径名处理,通配符处理,包括*,?,/。
第十一步
:根据命令的第一个词去查看,优先权一次是function命令,builtin,$PATH路径下的命令。
第十二步
:在设置重定向I/O后执行命令
这只是其中的一些步骤,并不是所有的。我们通过一个例子做进一步的解释。在执行这个命令之前,已经通过alias ll=”ls -l”。用户目录为/home/alice,$$的值为2537。看看执行命令ll $(type -path cc) ~alice/.*$(($$%1000))的过程。
ll
$(type
-path
cc)
~alice/.*$(($$%1000))
分为各个词
ll
不是keyword,所以第二步骤无需处理任何
ls
-l
$(type
-path
cc)
~alice/.*$(($$%1000))
将ls -l来替代别名"ll".这是将重复第一步到第三步。
ls
-l
$(type
-path
cc)
~alice/.*$(($$%1000))
在第四步不处理任何
ls
-l
$(type
-path
cc)
/home/alice/.*$(($$%1000))
进行路径解析,将 ~alice解析为/home/alice
.
ls
-l
$(type
-path
cc)
/home/alice/.*$((2537%1000))
将$$接续为2537。$$的用法在以后学习。
ls
-l
/usr/bin/cc
/home/alice/.*$((2537%1000))
执行命令,替换"type -path cc".
ls
-l
/usr/bin/cc
/home/alice/.*537
进行算术运算。
ls
-l
/usr/bin/cc
/home/alice/.*537
第九步无处理。
ls
-l
/usr/bin/cc
/home/alice/.hist537
将文件名替代了通配符.*537。
在/usr/bin
中获得ls命令
/usr/bin/ls
是带选项-l以及两个参数执行的
相关链接: 我
的Linux操作相关文章
第一步骤
:将命令分给为token,根据空格,TAB, NEWLINE, ;, (, ), <, >, |, 以及 &。
第二步骤
:检查第一个token是否一些关键字,是否是引号,’/’是否是一个需要组合的符号,例如’{‘或者’(‘,看看是否需要读取下一行命令,如果需要,回到第1步骤,如此循环,直到获取完整的命令。如果不是组合命令的开始,而是其他关键字,例如结束fi等,报告语法错误。如果不是这些关键字,进入第3步骤。
第三步骤
:根据alias列表检查命令的第1个tocken,它取得alias的对应,重新回到第1步骤。回到第一步骤,允许alias的嵌套,就A表示B,B表示C,也允许alias表示一些整合命令的开头。
第四步骤
:大括号解析。例如将a{b,c},解析为ab ac。
第五步骤
:波浪号(~)解析,如果在一个词的最前,解释为用户的$HOME目录路径。
第六步骤
:参数解析。如果词开始为$,解析这个参数变量。
第七步骤
:是否因$的解析而产生命令替换。
第八步骤
:对$((string))的格式进行数学运算。
第九步骤
:经过第5步骤开始的几个步骤,重新将词分离,使用$IFS作为分隔符号。
第十步骤
:路径名处理,通配符处理,包括*,?,/。
第十一步
:根据命令的第一个词去查看,优先权一次是function命令,builtin,$PATH路径下的命令。
第十二步
:在设置重定向I/O后执行命令
这只是其中的一些步骤,并不是所有的。我们通过一个例子做进一步的解释。在执行这个命令之前,已经通过alias ll=”ls -l”。用户目录为/home/alice,$$的值为2537。看看执行命令ll $(type -path cc) ~alice/.*$(($$%1000))的过程。
ll
$(type
-path
cc)
~alice/.*$(($$%1000))
分为各个词
ll
不是keyword,所以第二步骤无需处理任何
ls
-l
$(type
-path
cc)
~alice/.*$(($$%1000))
将ls -l来替代别名"ll".这是将重复第一步到第三步。
ls
-l
$(type
-path
cc)
~alice/.*$(($$%1000))
在第四步不处理任何
ls
-l
$(type
-path
cc)
/home/alice/.*$(($$%1000))
进行路径解析,将 ~alice解析为/home/alice
.
ls
-l
$(type
-path
cc)
/home/alice/.*$((2537%1000))
将$$接续为2537。$$的用法在以后学习。
ls
-l
/usr/bin/cc
/home/alice/.*$((2537%1000))
执行命令,替换"type -path cc".
ls
-l
/usr/bin/cc
/home/alice/.*537
进行算术运算。
ls
-l
/usr/bin/cc
/home/alice/.*537
第九步无处理。
ls
-l
/usr/bin/cc
/home/alice/.hist537
将文件名替代了通配符.*537。
在/usr/bin
中获得ls命令
/usr/bin/ls
是带选项-l以及两个参数执行的
相关链接: 我
的Linux操作相关文章
相关文章推荐
- Bash Shell 命令行处理
- Linux学习日记 —— 10.3.3 Shell基础-Bash基本功能-输入输出重定向
- Linux学习之2——bash shell基本语法和变量
- Linux Bash Shell学习(十三):流程控制——while/util
- LINUX BASH SHELL,小小学习一下
- Linux bash Shell的命令行替换总结
- Linux Bash Shell学习(十六):数组
- Linux Bash Shell学习笔记
- Linux Bash Shell学习(十二):流程控制——select
- Bash Shell中命令行选项/参数处理
- Linux Bash Shell学习(九):流程控制——if/else
- Bash Shell中命令行选项/参数处理
- linux学习之旅(二)&& shell命令行基础讲解
- linux的shell(bash)脚本学习
- Linux Bash Shell学习(十一):流程控制——case
- Linux学习-shell脚本编程基础之处理用户输入
- linux 基础学习之三:bash shell初识 上
- Linux Bash Shell学习(一):开始看书《Learning the bash Shell,3rd》
- Linux系统命令及Shell脚本学习笔记五:字符处理
- Linux命令行与Shell脚本编程[学习笔记1]