没有匹配文件的 shell 通配符

没有匹配文件的 shell 通配符

我经常使用 shell 文件名通配来执行诸如操作所有/dev/sda/dev/sdb/dev/sdc等操作/dev/sd[a-f],但是,这依赖于磁盘上存在与该模式匹配的文件。今天我想gitk在每个master@{1}master@{2}等上运行,但gitk master@{[1-5]}不起作用,因为磁盘上没有与该模式匹配的文件名。

如何让 shell 执行通配而不考虑实际的磁盘文件?

答案1

如果没有匹配的文件,就无法进行 shell 通配。你需要大括号扩展:

gitk master@{{1..5}}

或者:

gitk master@{{1,2,3,4,5}}

对于 form {x..y},您需要zsh 2.6-beta4稍后、bash 3.0稍后、ksh93r稍后。

{x,y}最初是在 中csh,然后像 shell 首先一样复制到 Bourne ksh

答案2

至少在 bash 中你可以使用范围,例如

$ echo gitk master@{{1..5}}
gitk master@{1} master@{2} master@{3} master@{4} master@{5}

显然,上面使用回声只是为了显示发生了什么。

它也适用于字母:

$ echo /dev/sd{x..z}
/dev/sdx /dev/sdy /dev/sdz

注意:是glob匹配,还有正则表达式匹配。这是两件不同的事情。 shell 进行全局匹配。所以Shell 正则表达式 通配符不是一个东西。

相关内容