我目前正在实现一个 shell,并希望根据众所周知的 shell 来模仿通配符的行为。
假设有一个命令foo
需要两个文件名参数。那是:
foo file1.txt file2.txt
是正确的用法。还假设当前目录中有以下文件。
file1.txt
file2.txt
file3.txt
file1.dat
file4.dat
在 shell(例如 Bash)中执行命令时是否可以使用多个 glob 参数?例如,
foo *.txt *.dat
如果是这样,这意味着什么或评估什么?我想知道将执行哪些组合,如下所示:
foo file1.txt file1.dat
foo file2.txt file4.dat
...
提前致谢!
答案1
当然。您自己可以尝试一下,所花的时间比提出问题所需的时间还要短。
Unix shell(例如 bash)扩展通配符前调用该程序。程序本身看不到参数的预扩展版本。
因此,在您的示例中,foo
将使用多个参数调用,第一个参数将是 的扩展*.txt
,最后一个将是 的扩展*.dat
。
通常 的扩展*.txt
将是当前目录中以.txt
.如果没有,那么 的扩展*.txt
只是不变的*.txt
。这可以通过 和shopt -s nullglob
来改变set -f
答案2
将 glob 扩展为数组可能会有所帮助。这将foo
在每次配对时调用:
shopt -s nullglob
txts=(*.txt)
dats=(*.dat)
for txt in "${txts[@]}"; do
for dat in "${dats[@]}"; do
foo "$txt" "$dat"
done
done