在《UNIX SHELL范例精解》中,关于命令行解析顺序是这么说的:
1,执行历史命令替代
2,命令行分解成词
3,更新历史命令
4,引用的处理
5,别名替代和函数的定义
6,设置重定向,后台进程和管道
7,执行变量替换(如$name、$user等)
8,执行命令替换(如`date`代替Today)
9,执行文件名替换(如cat abc.??,rm *.c等)
10,执行命令
- [root@rac0 ~]# echo $((12+34.0)) >/dev/null 2>&1
- -bash: 12+34.0: syntax error: invalid arithmetic operator (error token is ".0")
既算术扩展在重定向之前被解析。
查了一下man,关于扩展的解析顺序是
- The order of expansions is: brace expansion, tilde expansion, parameter, vari-
- able and arithmetic expansion and command substitution (done in a left-to-right
- fashion), word splitting, and pathname expansion.
可以看出,这些扩展基本上都在分解词之前被执行。注意其中有“command substitution”一项,把上面的例子改一下
- [root@localhost ]# `echo $((12+34.0))` &> /dev/null
- bash: 12+34.0: syntax error: invalid arithmetic operator (error token is ".0")
可以看出命令替换也在重定向之前。以此推论,变量替换也属于分解词阶段,也在重定向之前。
阅读(1204) | 评论(0) | 转发(0) |