我经常使用 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 正则表达式 通配符不是一个东西。