1,用空格分隔的字符串?
如果我执行rm -r *.txt
那里有很多TXT文件,我得到一个“参数列表太长”错误,它似乎告诉我它在路径名扩展后等于rm -r a.txt b.txt...c.txt
。
2,只是特定命令使用的列表对象?
如果我执行tar --exclude *.txt a.tar.gz a
,其中有两个TXT文件(“a.txt”和“b.txt”),结果与执行tar --exclude a.txt b.txt a.tar.gz a
不同。据此,也许我们可以得到返回列表对象的结论,而不是由空格分隔的字符串。
我有一个名为a的目录,结构如下:
a
├── a.txt
├── b.txt
└── cc
如果我执行tar --exclude *.txt -czvf a.tar.gz a
,我会得到以下结果:
a/
a/cc
“a.tar.gz”在没有* .txt文件的情况下成功生成。
如果我执行tar --exclude a.txt b.txt -czvf b.tar.gz a
,我会得到以下结果:
tar: b.txt:cat not stat: no such file or directory
a/
a/cc
a/b.txt
“b.tar.gz”是在没有a.txt和cc和b.txt
的情况下生成的@Jan Hudec
答案 0 :(得分:1)
都不是。它返回字符串列表。
在文件名生成之前执行分词,因此在那时,shell已经使用了将形成命令的字符串列表。生成的文件名作为单独的条目插入到该列表中。
如果我执行了rm -r * .txt,那里有很多TXT文件,我会得到一个"参数列表太长"错误,它似乎告诉我它在路径名扩展后等于rm -r a.txt b.txt ... c.txt。
所以,是的,确实如此。如果某些文件的名称中有空格,则会正确传递(如果模式返回一个以空格分隔的字符串,则不会这样做)。但是:
如果我执行
tar --exclude *.txt a.tar.gz a
,其中有两个TXT文件(" a.txt"和" b.txt"),结果与执行{不同{1}}。
您忘了提及这些文件位于tar --exclude a.txt b.txt a.tar.gz a
目录中。因此,a
将不扩展为*.txt
,a.txt
,因为没有此类文件 - 只有b.txt
和{{1} }。这里有一个快速的bash(zsh可以配置任何一种方式):一个与任何东西不匹配的模式保持不变。所以
a/a.txt
扩展为a/b.txt
,tar --exclude *.txt a.tar.gz a
,tar
,--exclude
和*.txt
。并且a.tar.gz
对a
选项的参数进行了自己的通配符处理。
但是,如果当前目录中还有tar
和--exclude
,则会扩展为c.txt
,d.txt
,tar
,{{1 },--exclude
和c.txt
并分解。为了防止这种情况,引用模式:
d.txt
答案 1 :(得分:-1)
由空格分隔的字符串。在将参数传递给命令之前,shell将完成扩展。使用tar时如果要将模式传递给--exclude选项,请将其放在单引号之间,如tar --exclude '*.txt' -czf a.tar.gz a