如果当前目录中存在文件'in',为什么'[:print:][:blank:]'会变得'in'?



这正常吗?我试过了(说来话长……这一切都是从bash、dash和ksh的蹩脚引用开始的。在所有情况下我得到:

$ echo [:print:][:blank:]
[:print:][:blank:]
$ touch in
$ echo [:print:][:blank:]
in

我认为它与'in'是'print'的子字符串有关,但是(说)'pr'不行:

$ rm in; touch pr
$ echo [:print:][:blank:]
[:print:][:blank:]

同时,去掉'blank'可以去掉this:

$ touch in; echo [:print:]         
[:print:]

我完全迷路了。提前感谢您的帮助!

[:print:][:blank:]被视为glob模式,因此任何匹配它的文件名都将被打印,就像您说echo *一样(在空目录中尝试)。

[:print:]被解释为"字符{:, p, r, i, n, t}之一",[:blank:]同样如此;因此与in匹配,但与pr不匹配。

(pr将匹配[:print:][:print:])

这是因为shell执行路径名展开,并用匹配该模式的文件名按字母顺序排序的列表替换模式[:print:][:blank:]。如果没有找到匹配的文件名,则保持单词不变。因此,如果您的目录包含一个名为in的文件,它将被拾取,因为它与模式匹配。

同样地,如果你有pbta等文件,它们也会被拾取。但是,pr与模式不匹配。

这些文件名然后被传递给echo并打印在屏幕上。

更多信息,请参见bash手册页

最新更新