免费注册 查看新帖 |

Chinaunix

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

窥豹一斑:通过$@看bash对一个简单命令的预处理  关闭 [复制链接]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-24 12:10 |只看该作者 |倒序浏览
http://bbs.chinaunix.net/viewthread.php?tid=704241&extra=page%3D1
在这个帖子中大家讨论了一些关于$@与$*的话题,但当我试图完全解释其中的每个结果时,感到了巨大的困难。
下面是我对bash工作原理的一些理解和心得,大部分来自bash的manpage。这不是一篇官方文档,很多地方可能用字不当或是对原理的误解,请

大家即时指出,以免误导观众。

1.相关的两个重要的基本定义:
字(word/token): shell中由字符序列构成的一个处理单位。
元字符(metacharacter): 当没有被引用时(when unquoted),对shell具有特殊含义,并导致字分割,bash中的元字符有且只有:
|  & ; ( ) < > space tab

2.bash如何处理一个简单命令(Simple command)
2.1什么是简单命令?
用白话说:shell会一句句执行命令,那么每一个句子就是一条简单命令
严谨点的定义:由可选的赋值列表,重定向操作,命令,参数构成的序列,它将由 换行符 | & && || ; 终止。
比如下面就是一个简单命令: a=123 echo 1  >file &
相对于简单命令:还有其它一些shell命令的形式:
流水线(Pipelines): Smiple-command1|Smiple-command2|.....
命令列表(List): Pipelines1&&Pipelines2||.....
组合命令: (list1
             list2 ...)
           { list
           list; }
2.2bash读入一行命令时,首先作的是什么?
首先作的就是用元字符把这一行命令分割成字,然后从左到右去决定下一步作什么,比如判断是不是一个开放的语句而去读下一行
是不是一个alias要替代,是一个简单命令还是个命令列表......这些暂且不表,以免离题太远。

2.3好了,就算bash当前处理的是一个简单命令,那它又将干些什么呢?
bash读入一个简单命令,它将进行一系列的预处理(performed);首先就是用元字符对它进行分割成为字(这个对任何命令形式都是一样的,参(2.2)
然后从左到右扫描第个字进行以下四步预处理:
s1.如果字是赋值操作(比如var=123),或IO重定向操作,将保留下来以备以后的处理
s2.陈了上面两种情况的其它字将进行扩展,其规则在下面详述,扩展结果的第一个字作为命令名字,其它作为它的参数
s3.准备IO重定向
s4.对赋值操作进行扩展,它的扩展规则与s2有些不同,下面会进行讨论。如果本行命令进行了s2的处理,那么赋值后的变量将作为环境变量传

给s2中的命令,如果本行没有命令名字,那么赋值操作将在本进程中进行。
这时shell就可以进行引用的移除(用作引用的"'将被移除)判断命令名字是函数/内置命令(如果是内置命令eval还要送回最开始进行新一轮的处理),如果不是还要进行路径扩展寻找加载的命令在什么地方等等(这些也从略吧)

3.上面的扩展遵循什么规则
3.1 s2的扩展如何进行:
扩展包括先后7个步骤:每个步骤都按从左到右的顺序进行
  1. e1大括号扩展(brace expansion)
  2. e2波浪号扩展(tilde expansion)
  3. e3参数扩展与变量替代(parameter and variable expansion)
  4. e4命令替代(command substitution)
  5. e5数学扩展(arithmetic  expansion)
  6. e6单词分割(word  splitting)
  7. e7路径扩展(pathname expansion)
复制代码

我们重点讨论的就是e3与e6
注意上面的扩展只有e1和e6e7会改变字的数量,其它的扩展都是从一个字变为另一个字,除了数组变量的扩展"$array[@]"
还要注意的就是引用(quoted/qouting),O'eilly的《learning the bash shell》一书中给了一个形象的扩展路线图,相信大家也都熟悉,就

把它挂在下面以作参考

3.2 s4中赋值操作的扩展如何进行
它将包含四步:
  1. e2波浪号扩展(tilde expansion)
  2. e3参数扩展与变量替代(parameter and variable expansion)
  3. e4命令替代(command substitution)
  4. e5数学扩展(arithmetic  expansion)
复制代码

而且遵循附图中qouting作用的规则
(为什么没有e1和e6,当然不应该有:想像一下:如果 var={1,2}会进行e1的扩展的话,它会被扩展为: var=1 2,这显然是个病句,e6也是一样的),最后进行引用的移除(用作引用的"'将被移除)并将结果赋值于变量
3.3 e6单词分割
在进行了e3e4e5(parameter and variable expansion command substitution arithmetic  expansion)之后,bash会对它们的结果进行再一次的分割,注意只是这三种扩展的结果才进行二次分割,显然这种分割是必要的,如果你不希望这种分割,请使用quoting。
这次分割将按照IFS变量的值进行
3.4 e3中的参数扩展中数组变量如何进行扩展
一个标准变量$var或单个数组元素${a[3]}的扩展是简单明了的,但对于数组,有几个特殊的扩展
${a[* ]}将扩展为包含每个数组元素一个字${a[1]}\c${a[2]}\c........${a[n]} 其中\c是IFS的第一个字符,如果IFS为缺省值,\c是space,如果IFS设置为空(null),则\c也为空
${a[@]}将扩展为n个字,每个数组元素为一个字,注意扩展后结果的首尾字是“开放性的”
比如
  1. var=(a b c)
  2. echo 1${var[@]}3
  3. 处理后将分割为4个字
  4. `echo'、`1a'、`b'与`c3'注意 a与1不会分成两个字
复制代码


"${a[@]}"将会用"引用${a[@]}扩展成的每个字让它不进行word splitting与pathname expansion
(这里我的解释与manpage中稍有不同,manpage中指出只有"${a[@]}"才会扩展成n个字,但我认为不加引号一样是n个字)

3.5 $* $@与"$*" "$@"
上面四个变量只是对一个特殊数组的引用--位置参数,与对其它数组的处理没什么不同

3.6赋值操作时如何处理${a[* ]}与${a[@]}
${a[* ]}与"${a[* ]}"不用多讲了,它们本身就是一个字,而且因为赋值操作不进行参数扩展后的word splitting,又因为赋值操作最后的引号去除处理, var=${a[* ]}与var="${a[* ]}"不会产生任何不同的结果
而对于var=${a[@]},因为$var只可能是一个字,可以在赋值时${a[@]}扩展的n个字被赋值操word splitting用space连成一个字。var="${a[@]}"则保护不进行word splitting拆分

[ 本帖最后由 waker 于 2006-2-24 12:38 编辑 ]

bash3-cmd.gif (22.84 KB, 下载次数: 155)

bash3-cmd.gif

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2006-02-24 12:11 |只看该作者
好了,唠叨了这么多,试着读解一下incompat.sh的结果吧


  1. #!/bin/bash

  2. #  Erratic behavior of the "$*" and "$@" internal Bash variables,
  3. #+ depending on whether they are quoted or not.
  4. #  Inconsistent handling of word splitting and linefeeds.


  5. set -- "First one" "second" "third:one" "" "Fifth: :one"
  6. # Setting the script arguments, $1, $2, etc.

  7. echo

  8. echo 'IFS unchanged, using "$*"'
  9. c=0
  10. for i in "$*"               # quoted
  11. do echo "$((c+=1)): [$i]"   # This line remains the same in every instance.
  12.                             # Echo args.
  13. done
  14. ###############
  15. #结果
  16. #1: [First one second third:one  Fifth: :one]
  17. #$*被扩展为一个字`First one second third:one  Fifth: :one',注意扩展时的\c为space
  18. #由于""的作用,不进行word splitting
  19. #变量i in 一个字
  20. ###############

  21. echo ---

  22. echo 'IFS unchanged, using $*'
  23. c=0
  24. for i in $*                 # unquoted
  25. do echo "$((c+=1)): [$i]"
  26. done
  27. ###############
  28. #结果
  29. #1: [First]
  30. #2: [one]
  31. #3: [second]
  32. #4: [third:one]
  33. #5: [Fifth:]
  34. #6: [:one]
  35. #$*被扩展为一个字`First one second third:one  Fifth: :one',注意扩展时的\c为space
  36. #然后进行word splitting扩展为`First'、`one'、 `second'、`third:one'、`Fifth:'、`:one'六个字,
  37. 注意使用缺省IFS时中间连续的空格被解释为一个字分割符
  38. #变量i in 六个字`First'、`one'、 `second'、`third:one'、`Fifth:'、`:one'
  39. ###############

  40. echo ---

  41. echo 'IFS unchanged, using "$@"'
  42. c=0
  43. for i in "$@"
  44. do echo "$((c+=1)): [$i]"
  45. done
  46. #结果
  47. #1: [First one]
  48. #2: [second]
  49. #3: [third:one]
  50. #4: []
  51. #5: [Fifth: :one]
  52. #$@被扩展为五个字`First one'、`second'、`third:one'、`空字串'、`Fifth: :one'
  53. #由于""的作用,不进行word splitting
  54. #变量i in 五个字`First'、`one'、 `second'、`third:one'、`Fifth: :one'

  55. echo ---

  56. echo 'IFS unchanged, using $@'
  57. c=0
  58. for i in $@
  59. do echo "$((c+=1)): [$i]"
  60. done
  61. #结果
  62. #1: [First]
  63. #2: [one]
  64. #3: [second]
  65. #4: [third:one]
  66. #5: [Fifth:]
  67. #6: [:one]
  68. #$@被扩展为五个字`First one'、`second'、`third:one'、`空字串'、`Fifth: :one'
  69. #然后进行word splitting扩展为`First'、`one'、 `second'、`third:one'、`Fifth:'、`:one'六个字,注意由于没有""的保护上一步那个空

  70. 字串已经不见了
  71. #变量i in 六个字`First'、`one'、 `second'、`third:one'、`Fifth:'、`:one'

  72. echo ---

  73. IFS=:
  74. echo 'IFS=":", using "$*"'
  75. c=0
  76. for i in "$*"
  77. do echo "$((c+=1)): [$i]"
  78. done
  79. ###############
  80. #结果
  81. #1: [First one:second:third:one::Fifth: :one]
  82. #$*被扩展为一个字`First one:second:third:one::Fifth: :one',注意扩展时的\c为:
  83. #由于""的作用,不进行word splitting
  84. #变量i in 一个字
  85. ###############

  86. echo ---

  87. echo 'IFS=":", using $*'
  88. c=0
  89. for i in $*
  90. do echo "$((c+=1)): [$i]"
  91. done
  92. ###############
  93. #结果
  94. #1: [First one]
  95. #2: [second]
  96. #3: [third]
  97. #4: [one]
  98. #5: []
  99. #6: [Fifth]
  100. #7: [ ]
  101. #8: [one]
  102. #$*被扩展为一个字`First one:second:third:one::Fifth: :one',注意扩展时的\c为:
  103. #然后进行word splitting扩展为`First one'、`second'、`third'、`one'、`空字串'、`Fifth'、` '、`one'八个字,
  104. 注意使用指定IFS时每间个IFS都被认为是一个字分割符
  105. #变量i in 八个字`First one'、`second'、`third'、`one'、`空字串'、`Fifth'、` '、`one'
  106. ###############

  107. echo ---

  108. var=$*
  109. echo 'IFS=":", using "$var" (var=$*)'
  110. c=0
  111. for i in "$var"
  112. do echo "$((c+=1)): [$i]"
  113. done
  114. ###############
  115. #结果
  116. #1: [First one:second:third:one::Fifth: :one]
  117. #$*被扩展为一个字`First one:second:third:one::Fifth: :one'并赋值给var,注意扩展时的\c为:
  118. #由于""的作用,$var替代后不进行word splitting
  119. #变量i in 一个字`First one:second:third:one::Fifth: :one'
  120. ###############

  121. echo ---

  122. echo 'IFS=":", using $var (var=$*)'
  123. c=0
  124. for i in $var
  125. do echo "$((c+=1)): [$i]"
  126. done
  127. ###############
  128. #结果
  129. #IFS=":", using $var (var=$*)
  130. #1: [First one]
  131. #2: [second]
  132. #3: [third]
  133. #4: [one]
  134. #5: []
  135. #6: [Fifth]
  136. #7: [ ]
  137. #8: [one]
  138. #1: [First one:second:third:one::Fifth: :one]
  139. #$*被扩展为一个字`First one:second:third:one::Fifth: :one'并赋值给var,注意扩展时的\c为:
  140. #$var替代后进行word splitting扩展为`First one'、`second'、`third'、`one'、`空字串'、`Fifth'、` '、`one'八个字,
  141. 注意使用指定IFS时每间个IFS都被认为是一个字分割符
  142. #变量i in 八个字`First one'、`second'、`third'、`one'、`空字串'、`Fifth'、` '、`one'
  143. ###############

  144. echo ---

  145. var="$*"
  146. echo 'IFS=":", using $var (var="$*")'
  147. c=0
  148. for i in $var
  149. do echo "$((c+=1)): [$i]"
  150. done
  151. ###############
  152. #结果
  153. #IFS=":", using $var (var=$*)
  154. #1: [First one]
  155. #2: [second]
  156. #3: [third]
  157. #4: [one]
  158. #5: []
  159. #6: [Fifth]
  160. #7: [ ]
  161. #8: [one]
  162. #$*被扩展为一个字`First one:second:third:one::Fifth: :one'并赋值给var,注意扩展时的\c为:
  163. #$var替代后进行word splitting扩展为`First one'、`second'、`third'、`one'、`空字串'、`Fifth'、` '、`one'八个字,
  164. 注意使用指定IFS时每间个IFS都被认为是一个字分割符
  165. #变量i in 八个字`First one'、`second'、`third'、`one'、`空字串'、`Fifth'、` '、`one'
  166. ###############


  167. echo ---

  168. echo 'IFS=":", using "$var" (var="$*")'
  169. c=0
  170. for i in "$var"
  171. do echo "$((c+=1)): [$i]"
  172. done
  173. ###############
  174. #结果
  175. #1: [First one:second:third:one::Fifth: :one]
  176. #$*被扩展为一个字`First one:second:third:one::Fifth: :one'并赋值给var,注意扩展时的\c为:
  177. #由于""的作用,$var替代后不进行word splitting
  178. #变量i in 一个字`First one:second:third:one::Fifth: :one'
  179. ###############

  180. echo ---

  181. echo 'IFS=":", using "$@"'
  182. c=0
  183. for i in "$@"
  184. do echo "$((c+=1)): [$i]"
  185. done
  186. ###############
  187. #结果
  188. #1: [First one]
  189. #2: [second]
  190. #3: [third:one]
  191. #4: []
  192. #5: [Fifth: :one]
  193. #$@被扩展为五个字`First one'、`second'、`third:one'、`空字串'、`Fifth: :one'
  194. #由于""的作用,不进行word splitting
  195. #变量i in 五个字`First one'、`second'、`third:one'、`'、`Fifth: :one'
  196. ###############
  197. echo ---

  198. echo 'IFS=":", using $@'
  199. c=0
  200. for i in $@
  201. do echo "$((c+=1)): [$i]"
  202. done
  203. #结果
  204. 1: [First one]
  205. 2: [second]
  206. 3: [third]
  207. 4: [one]
  208. 5: []
  209. 6: [Fifth]
  210. 7: [ ]
  211. 8: [one]
  212. ###############
  213. #$@被扩展为五个字`First one'、`second'、`third:one'、`空字串'、`Fifth: :one'
  214. #这五个字再进行word splitting,扩展为`First one'、`second'、`third'、`one'、`空字串'、`Fifth'、` '、`one'八个字
  215. #注意这里的第3和4由上一上步的`third:one'扩展,第678由`Fifth: :one'扩展
  216. #变量i in 八个字`First one'、`second'、`third'、`one'、`空字串'、`Fifth'、` '、`one'
  217. ###############

  218. echo ---

  219. var=$@
  220. echo 'IFS=":", using $var (var=$@)'
  221. c=0
  222. for i in $var
  223. do echo "$((c+=1)): [$i]"
  224. done
  225. ###############
  226. #结果
  227. #1: 1: [First one second third one  Fifth   one]
  228. #$@被扩展为五个字`First one'、`second'、`third:one'、`空字串'、`Fifth: :one'并word splitting成为`First one'、`second'、#`third'、`one'、`空字串'、`Fifth'、` '、`one'再由space串成一串赋值给var
  229. #$var在替代后进行word splitting,由于不包含IFS,所以分不分都一样
  230. #变量i in 一个字`First one second third one  Fifth   one'
  231. ###############

  232. echo ---

  233. echo 'IFS=":", using "$var" (var=$@)'
  234. c=0
  235. for i in "$var"
  236. do echo "$((c+=1)): [$i]"
  237. done
  238. ###############
  239. #结果
  240. #1: 1: [First one second third one  Fifth   one]
  241. #$@被扩展为五个字`First one'、`second'、`third:one'、`空字串'、`Fifth: :one'并word splitting成为`First one'、`second'、#`third'、`one'、`空字串'、`Fifth'、` '、`one'再由space串成一串赋值给var
  242. #$var不进行word splitting
  243. #变量i in 一个字`First one second third one  Fifth   one'
  244. ###############
  245. echo ---

  246. var="$@"
  247. echo 'IFS=":", using "$var" (var="$@")'
  248. c=0
  249. for i in "$var"
  250. do echo "$((c+=1)): [$i]"
  251. done
  252. ###############
  253. #结果
  254. #1: 1: [First one second third:one  Fifth: :one]
  255. #"$@"被扩展为五个字`First one'、`second'、`third:one'、`空字串'、`Fifth: :one'并由space串成一串赋值给var
  256. #$var不进行word splitting
  257. #变量i in 一个字`First one second third:one  Fifth: :one'
  258. ###############

  259. echo ---

  260. echo 'IFS=":", using $var (var="$@")'
  261. c=0
  262. for i in $var
  263. do echo "$((c+=1)): [$i]"
  264. done
  265. ###############
  266. #结果
  267. #1: [First one second third]
  268. #2: [one  Fifth]
  269. #3: [ ]
  270. #4: [one]
  271. #"$@"被扩展为五个字`First one'、`second'、`third:one'、`空字串'、`Fifth: :one'并由space串成一串赋值给var
  272. #$var在替代后进行word splitting,由一个字`First one second third:one  Fifth: :one'分割为`First one second'
  273. `third'、`one Fifth'、` '、`one'四个字
  274. #变量i in 四个字`First one second'、`third'、`one Fifth'、` '、`one'
  275. ###############

  276. echo

  277. # Try this script with ksh or zsh -y.

  278. exit 0

  279. # This example script by Stephane Chazelas,
  280. # and slightly modified by the document author.
复制代码

[ 本帖最后由 waker 于 2006-2-24 13:25 编辑 ]

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
3 [报告]
发表于 2006-02-24 13:16 |只看该作者
原帖由 waker 于 2006-2-24 12:10 发表
echo ---

echo 'IFS=":", using "$@"'
c=0
for i in "$@"
do echo "$((c+=1)): [$i]"
done
###############
#结果
#1: [First one]
#2: [second]
#3: [thirdne]
#4: []
#5: [Fifth: ne]
#$@被扩展为五个字`First one'、`second'、`thirdne'、`空字串'、`Fifth: ne'
#由于""的作用,不进行word splitting
#变量i in 五个字`First'、`one'、 `second'、`thirdne'、`Fifth: ne'
###############

从结果看:变量i in 五个字应该是`First one'、 `second'、`thirdne'、`'、`Fifth: ne'
是笔误还是我的理解不对?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
4 [报告]
发表于 2006-02-24 13:26 |只看该作者
改,有很多都是cp的

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
5 [报告]
发表于 2006-02-24 14:16 |只看该作者
瓦兄:文中提到 var=${a[* ]}与var="${a[* ]}"不会产生任何不同的结果

bash 2.05b中,在不使用默认IFS的情况下,这两种方式还是有区别的。
请看下面的测试
  1. r2007@www r2007 $ IFS=:
  2. r2007@www r2007 $ a[0]=123
  3. r2007@www r2007 $ a[1]=abc:xyz
  4. r2007@www r2007 $ a[2]=...
  5. r2007@www r2007 $ v1=${a[*]}
  6. r2007@www r2007 $ v2="${a[*]}"
  7. r2007@www r2007 $ echo $v1
  8. 123 abc xyz ...
  9. r2007@www r2007 $ echo "$v1"
  10. 123 abc xyz ...
  11. r2007@www r2007 $ echo $v2
  12. 123 abc xyz ...
  13. r2007@www r2007 $ echo "$v2"
  14. 123:abc:xyz:...
  15. r2007@www r2007 $ unset IFS
  16. r2007@www r2007 $ echo $v1
  17. 123 abc xyz ...
  18. r2007@www r2007 $ echo $v2
  19. 123:abc:xyz:...
  20. r2007@www r2007 $
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2006-02-24 14:36 |只看该作者
等我当上 shell 版主了我给你设精华

论坛徽章:
0
7 [报告]
发表于 2006-02-24 16:51 |只看该作者
[quote]原帖由 r2007 于 2006-2-24 14:16 发表
瓦兄:文中提到 var=${a[* ]}与var="${a[* ]}"不会产生任何不同的结果

bash 2.05b中,在不使用默认IFS的情况下,这两种方式还是有区别的。
请看下面的测试
  1. r2007@www r2007 $ IFS=:
  2. r2007@ ... [/quote]

  3. 是的,在默认的情况下,也有特例

  4. [code]

  5. x=('1 2' '3  4')

  6. y=${x[*]}
  7. z="${x[*]}"

  8. echo "$y"
  9. 1 2 3 4
  10. echo "$z"
  11. 1 2 3  4

复制代码


而且"$@"等同于"$1" "$2" ... "$N" ,所以我个人认为,$@也是被IFS分割的,这样我觉得能更好的解释waker兄的例子

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
8 [报告]
发表于 2006-02-24 17:09 |只看该作者
呵呵,越来越复杂了,再研究一下

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2006-02-24 17:38 |只看该作者
原帖由 waker 于 2006-2-24 12:10 发表
...
元字符(metacharacter): 当没有被引用时(when unquoted),对shell具有特殊含义,并导致字分割,bash中的元字符有且只有:
|  & ; ( ) < > space tab
...

瓦兄,newline也应该属于原字符吧?

论坛徽章:
0
10 [报告]
发表于 2006-02-24 19:57 |只看该作者
原帖由 woodie 于 2006-2-24 17:38 发表

瓦兄,newline也应该属于原字符吧?


对的,根据Learning the bash Shell - 2nd Edition (o'reilly)和man page中的陈述,在所有的expansion完成后,对那些不是从expansion中得到的引用进行移除(\,",'),也就是路径等扩展完成后,在重定向之前。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP