shell中路径名扩展后返回的内容是什么?

时间:2017-05-09 05:56:15

标签: shell pathname

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

2 个答案:

答案 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扩展为*.txta.txt,因为没有此类文件 - 只有b.txt和{{1} }。这里有一个快速的bash(zsh可以配置任何一种方式):一个与任何东西不匹配的模式保持不变。所以

a/a.txt

扩展为a/b.txttar --exclude *.txt a.tar.gz a tar--exclude*.txt。并且a.tar.gza选项的参数进行了自己的通配符处理。

但是,如果当前目录中还有tar--exclude,则会扩展为c.txtd.txttar,{{1 },--excludec.txt并分解。为了防止这种情况,引用模式:

d.txt

答案 1 :(得分:-1)

由空格分隔的字符串。在将参数传递给命令之前,shell将完成扩展。使用tar时如果要将模式传递给--exclude选项,请将其放在单引号之间,如tar --exclude '*.txt' -czf a.tar.gz a