' Brace扩张'在Bash工作?

时间:2014-01-06 05:29:06

标签: bash brace-expansion

http://www.tldp.org/LDP/abs/html/special-chars.html

中有一个例子
$ echo {file1,file2}\ :{\ A," B",' C'}  
file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C

这是如何工作的?
我改变了这个命令,如下所示:

$ echo {file1,file2}\  {\ A," B",' C'}  
file1  file2   A  B  C
$ echo {file1,file2}\ -{\ A," B",' C'}  
file1 - A file1 - B file1 - C file2 - A file2 - B file2 - C

为什么第一个命令不像示例中的命令那样工作?
救命啊!

我知道我已经引入了额外的空间。如果将额外的空间改为其他东西(冒号,破折号等),那么一切都很好。
没有关于以下命令的详细信息:echo {“A”,“B”,“C”} \ {“D”,“E”,“F”} \ {“G”,“H”,“I”} http://www.tldp.org/LDP/abs/html/special-chars.html。我想了解更多。

1 个答案:

答案 0 :(得分:4)

  

为什么第一个命令不像示例中的命令那样工作?

因为你引入了额外的空间:

#                     |==> This is it!
#                     |
$ echo {file1,file2}\  {\ A," B",' C'}
file1  file2   A  B  C
$ echo {file1,file2}\ {\ A," B",' C'}    # This is probably what you expected!
file1  A file1  B file1  C file2  A file2  B file2  C

额外空格会导致shell首先展开{file1,file2},然后展开{\ A," B",' C'}


引自Brace Expansion

  

要扩展的模式采用可选前导码的形式,   然后是一系列以逗号分隔的字符串或序列   一对括号之间的表达,后跟一个可选的   后记。前导码以包含在其中的每个字符串为前缀   然后将括号和后记附加到每个结果上   字符串,从左向右扩展。

当你在大括号展开后引入一个空格( Backspace 后跟两个空格是空格!)时,以下标记不再被视为 postscript 并单独扩展。