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

时间:2011-07-18 15:23:46

标签: shell

这是正常的吗?我用bash,dash和ksh尝试了它(长篇故事......这一切都始于对其他东西的引用不佳)。在所有情况下,我得到:

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

我认为它与'in'有关,因为'in'是'print'的子串,但是(比方说)'pr'不会这样做:

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

此外,删除'空白'摆脱了这个:

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

我完全迷失了。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

同样,如果您有名为pbta等的文件,他们也会被选中。但是,pr与模式不匹配。

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

有关详细信息,请参阅bash man page

答案 1 :(得分:2)

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

[:print:]被解释为“其中一个字符{:prin,{{1 {}}}“和t类似;因此与[:blank:]匹配,但不与in匹配。

pr将匹配pr。)