我可以ls -l ../lib/boto/{route53,ec2,beanstalk,mturk}
在 Bash 中执行此操作并且它会产生预期的结果。
但是如果我这样做
$ git rm -r ../lib/boto/{route53,ec2,beanstalk,mturk}
我明白了
fatal: pathspec '../lib/boto/ec2' did not match any files
是否git
理解这个路径语法?
答案1
调用set -x
然后重复该命令。您首先看到的应该是您正在运行的实际命令。示例:
$ set -x
$ ls -l ../lib/boto/{route53,ec2,beanstalk,mturk}
+ ls --color=auto -l ../lib/boto/route53 ../lib/boto/ec2 ../lib/boto/beanstalk ../lib/boto/mturk
(actual output here, omitted)
$ set +x # to revert
它显示了我的ls
got --color=auto
(因为alias ls='ls --color=auto'
我碰巧有)但从来没有得到过这些括号({what,ever}
)。它们被 Bash 扩展了,这被称为括号扩展。
括号扩展是一种可以生成任意字符串的机制。此机制类似于文件名扩展,但生成的文件名不需要存在。
请注意,括号扩展与路径无关。它对任意字符串进行操作,并不关心结果是否可以解释为现有对象的路径或路径。
你的git
线路基本上和我的ls
线路一样。假设没有别名干扰,你实际上运行
git rm -r ../lib/boto/route53 ../lib/boto/ec2 ../lib/boto/beanstalk ../lib/boto/mturk
是否
git
理解这个路径语法?
无关紧要。它可能会或可能不会进行foo{bar,baz}
特殊处理;但即使它进行了特殊处理,你的 shell 也会先将其展开,而括号永远不会到达git
(除非你引用它们,否则你没有)。