免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2433 | 回复: 7
打印 上一主题 下一主题

[其他] bash命令处理的12个步骤疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-04 12:54 |只看该作者 |倒序浏览
bash命令处理的12个步骤:
1、将命令行分成由固定元字符集分隔的记号;
SPACE, TAB, NEWLINE, ; , (, ), <, >, |, &

记号类型包括单词,关键字,I/O重定向符和分号。

2、检测每个命令的第一个记号,查看是否为不带引号或反斜线的关键字。

如果是一个开放的关键字,如if和其他控制结构起始字符串,function,{或(,则命令实际上为一复合命令。shell在内部对复合命令进行处理,读取下一个命令,并重复这一过程。如果关键字不是复合命令起始字符串(如then等一个控制结构中间出现的关键字),则给出语法错误信号。

3、依据别名列表检查每个命令的第一个关键字;

如果找到相应匹配,则替换其别名定义,并退回第一步;否则进入第4步。该策略允许递归别名,还允许定义关键字别名。如alias procedure=function

4、执行大括号扩展,例如a{b,c}变成ab ac


5、如果~位于单词开头,用$HOME替换~。

使用usr的主目录替换~user。

6、对任何以符号$开头的表达式执行参数(变量)替换;


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

这里是嵌套的命令行处理。

8、计算形式为$((string))的算术表达式;


9、把行的参数,命令和算术替换部分再次分成单词,这次它使用$IFS中的字符做分割符而不是步骤1的元字符集;
10、对出现*, ?, [ / ]对执行路径名扩展,也称为通配符扩展;
11、按命令优先级表(跳过别名),进行命令查寻;
12、设置完I/O重定向和其他操作后执行该命令


一个命令分步处理的结果:
Further assume that a file exists called .hist537 in user alice's home directory, which is /home/alice, and that there is a double-dollar-sign variable $$ whose value is 2537 (we'll see what this special variable is in the next chapter).

Now let's see how the shell processes the following command:

ll $(type -path cc) ~alice/.*$(($$%1000))


Here is what happens to this line:

1.  ll $(type -path cc) ~alice/.*$(($$%1000)) splits the input into words.

2.  ll is not a keyword, so Step 2 does nothing.

3.  ls -l $(type -path cc) ~alice/.*$(($$%1000)) substitutes ls -l for its alias "ll". The shell then repeats Steps 1 through 3; Step 2 splits the ls -l into two words.

4.  ls -l $(type -path cc) ~alice/.*$(($$%1000)) does nothing.

5.  ls -l $(type -path cc) /home/alice/.*$(($$%1000)) expands ~alice into /home/alice.

6.  ls -l $(type -path cc) /home/alice/.*$((2537%1000)) substitutes 2537 for $$.

7.  ls -l /usr/bin/cc /home/alice/.*$((2537%1000)) does command substitution on "type -path cc".

8.  ls -l /usr/bin/cc /home/alice/.*537 evaluates the arithmetic expression 2537%1000.

9.  ls -l /usr/bin/cc /home/alice/.*537 does nothing.

10. ls -l /usr/bin/cc /home/alice/.hist537 substitutes the filename for the wildcard expression .*537.

11. The command ls is found in /usr/bin.

12./usr/bin/ls is run with the option -l and the two arguments.

Although this list of steps is fairly straightforward, it is not the whole story. There are still five ways to modify the process: quoting; using command, builtin, or enable; and using the advanced command eval.


结合上面的例子,对bash命令处理的12个步骤有了进一步的理解,但是还存在一些疑惑,求大师们解答啊~

1.针对步骤一中的固定元字符集中包含 (, ), 例子中的$(type -path cc)并没有被分割成两个记号(token),从步骤7处理时把$(type -path cc)当成一个记号(token)可以看出
2.记号类型中:单词我理解的是包含命令,如echo;普通字符串,如a=123,关键字我理解的就是if,for,while等需要结合其他的字符进行操作的具有特定含义的字符串;但是不太理解做为固定元字符的I/O重定向符和分号是怎么又做为token的呢??

论坛徽章:
0
2 [报告]
发表于 2014-09-04 14:16 来自手机 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2014-09-04 16:39 |只看该作者
本帖最后由 siyecaoliu 于 2014-09-04 16:40 编辑

一起学习!!!
求大神们答疑解惑啊,难道大家都没有看到问题吗???

回复 2# chenzhiquan2000


   

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
4 [报告]
发表于 2014-09-04 17:20 |只看该作者
1、我认为 $(type -path cc) 已经被分割了,它就是按照元字符把命令分割成token,至于这些token组合起来表达什么意思(命令替换、算数运算等)它根本不关心。

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
5 [报告]
发表于 2014-09-04 17:53 |只看该作者
本帖最后由 chengchow 于 2014-09-04 17:54 编辑

看标题当成普及贴了,学习了,这块还真没了解过,随便说说了

$(type -path cc)应该是被看作了一个整体,$改变了后面()的含义,这里并没有做分隔,所以做运算的时候需要$(())
重定向和;已经不属于一个命令的范畴了,所以这里并没有说明。

论坛徽章:
0
6 [报告]
发表于 2014-09-04 19:45 |只看该作者
谢谢大神解答~
应该是大神说的这样,原想着现在把命令行拆分成了记号(token),下面的操作步骤就是以记号(token)为处理单元了,应该是自己想多了,下面的处理步骤确实没说一定要以记号(token)为处理单元,即使下面是以记号(token)为处理单元,也可以将步骤6、7、8以$开头的情况做为特殊情况处理~
回复 4# Shell_HAT


   

论坛徽章:
0
7 [报告]
发表于 2014-09-04 19:57 |只看该作者
看来标题名起错了,可是改不了呢
谢谢chengchow君的解答~
问题1我还是比较赞同HAT大神的说法,问题2中我觉得可能是因为;是命令之间的分隔符所以要作为一个特殊的记号;而重定向应该还是属于一个命令的范畴吧,只是可能由于步骤12提到的要预先设置i/o重定向,所以才作为一个特殊记号标识出来~ 我也是胡猜的,如有错误,还请大神帮忙指正,勿喷啊
回复 5# chengchow


   

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2014-09-05 09:21 |只看该作者
token word 就是字符串,可以包括任何东西。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP