免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: thinshootout
打印 上一主题 下一主题

关于shell的IFS [复制链接]

论坛徽章:
0
101 [报告]
发表于 2009-06-16 22:21 |只看该作者
《UNIX 超级工具》一书  第八章
8.05 命令行的评价(evaluation)
下面是C shell 解释命令行的顺序:
1. 历史替换
2. 分裂词(包括特殊字符)
3. 更新历史表
4. 解释单引号(') 和 双引号(")
5. 别名替换
6. 输入和输出的重定向(如 >  < 和 |)
7. 变量替换
8. 命令替换
9. 文件名扩展
(Bourne shell 的解释顺序本质上是一样的,除了它不执行历史替换和别名替换之外)

所以
A=B  echo    $A

的执行过程应该是这样的:
1. 没有历史操作符, 因此不进行历史替换(Bourne shell 不执行这一步)
2. 分裂词,每碰到未加引号的空白字符就会产生一个新“词”。这些词是 A=B、echo、$A。
3. shell 将命令行放到历史列表中。(Bourne shell 不执行这一步)
4. 没有引号需要解释
5. 没有别名需要替换
6. 没有输入或输出重定向需要处理
7. shell注意到变量$A,并把它替换成空
8. shell寻找左单引号,执行左单引号中的任何命令,并且将命令的输出插入到命令行中。在本例中,没有这方面的事需要做。(如果左单引号内有通配符或者变量,那么在shell运行左单引号中的命令之前它们是不会被解释的)
9. shell寻找通配符。本例中没有,不需要处理
10. shell 执行 A=B, 执行 echo 。

论坛徽章:
0
102 [报告]
发表于 2009-06-17 00:14 |只看该作者

回复 #101 doublelook 的帖子

tutern-desktop:~$ a=111 b=222
tutern-desktop:~$ echo $a $b
111 222
tutern-desktop:~$ a=333 b=444 echo $a $b
111 222
tutern-desktop:~$ echo $a $b
111 222
tutern-desktop:~$ a=555 b=666
tutern-desktop:~$ echo $a $b
555 666
tutern-desktop:~$

為什么 "a=333 b=444 echo $a $b" 不能影響a和b的值?
而 "a=333 b=444 "確可以?

[ 本帖最后由 tutern 于 2009-6-17 00:15 编辑 ]

论坛徽章:
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
103 [报告]
发表于 2009-06-17 08:50 |只看该作者
上面已经回答了。

[ 本帖最后由 blackold 于 2009-6-17 08:51 编辑 ]

论坛徽章:
0
104 [报告]
发表于 2009-06-17 09:59 |只看该作者
第一步分割是绝对不会涉及到IFS的
书上说的很明白arithmetic subsitution后的分词动作才会参考$IFS的定义
原话:
第一步分词
Splits the command into tokens that are separated by the fixed set of metacharacters: SPACE, TAB, NEWLINE, ;, (, ), <, >, |, and &. Types of tokens include words, keywords, I/O redirectors, and semicolons.
arithmetic subsitution后的分词
Takes the parts of the line that resulted from parameter, command, and arithmetic substitution and splits them into words again. This time it uses the characters in $IFS as delimiters instead of the set of metacharacters in Step 1.

论坛徽章:
0
105 [报告]
发表于 2009-06-17 11:16 |只看该作者

回复 #102 tutern 的帖子

怀疑 a=222 comm  这种写法中 a=222 就如同是 (a=222) 了
例如:
[root@Youngs ~]# a=111
[root@Youngs ~]# echo $a
111
[root@Youngs ~]# a=222 :
[root@Youngs ~]# echo $a
111
[root@Youngs ~]# a=333 sleep 2
[root@Youngs ~]# echo $a
111
[root@Youngs ~]# a=333 ls
anaconda-ks.cfg  ifcfg-PPP0   install.log.syslog  scsrun.log
ifcfg-ppp0       install.log  scsconfig.log       yy
[root@Youngs ~]# echo $a
111

论坛徽章:
0
106 [报告]
发表于 2009-06-17 12:26 |只看该作者
原帖由 網中人 于 2009-3-24 11:55 发表


嘿,俺也是半路出家。
學電腦之前我是拿鍋勺子的!

學無先後,達者為師。
大家一起加油!



半路出家的前辈!受俺一拜

论坛徽章:
0
107 [报告]
发表于 2009-06-30 13:33 |只看该作者
var=abc /the/command
这样写的意思是把 abc 赋值给 var, 然后把 var 这个变量 export 给 /the/command

var=abc echo $var
对于这行命令可以这样理解: echo 后面的 $var 是在 shell 扫面命令行时 expand 成 abc 的, 传给 echo 的是 abc 而不是 $var 
其实也是这样的
[dearvoid@LinuxEden:tty3 ~] # unset var
[dearvoid@LinuxEden:tty3 ~] # bash -c 'echo $var'

[dearvoid@LinuxEden:tty3 ~] # var=abc bash -c 'echo $var'
abc
[dearvoid@LinuxEden:tty3 ~] # echo $var

[dearvoid@LinuxEden:tty3 ~] # o

论坛徽章:
0
108 [报告]
发表于 2009-06-30 16:53 |只看该作者
我开的这个帖子这么久了,早就结贴了,没想到还是有这么多同学困惑~
谈谈我现在的个人理解吧~

如:
# unset A
# A=B echo $A
对于A=B echo $A,shell需要扫描命令行,当其发现$A时,对其替换,由于此时A变量为空(A=B还未执行,除非是:A=B; echo $A),故对shell来说,它最终看到的应该是:A=B echo;
最后,shell调用echo(别管这个东东是shell内置的还是第三方程序),将A=B作为环境变量置入函数调用栈中。但由于此时echo的参数是空串,故命令行中的A=B并为起到效果(当然,实际上A=B还是传到程序echo中了!)。

博学之,审问之,慎思之,明辨之,笃行之~
与诸位共勉~

论坛徽章:
0
109 [报告]
发表于 2009-07-06 14:09 |只看该作者
楼上
将A=B作为环境变量置入函数调用栈中   怎么能看到 A被置入到函数调用栈啦????
还有      A=B echo $A中的变量赋值只影响当前命令的执行环境,不影响当前shell的环境
当前命令的执行环境 是什么意思?

其实我觉得里面 关联到 环境变量  shell执行顺序 等 。。。。。。。。

[ 本帖最后由 xin2v 于 2009-7-6 14:11 编辑 ]

论坛徽章:
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
110 [报告]
发表于 2009-07-06 14:48 |只看该作者

回复 #109 xin2v 的帖子

上面的贴子已经说得很清楚了,自己慢慢看吧。

你把它理解为临时变量就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP