我正在使用 Linux 和以下版本的 bash:
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
当我输入:
echo file{[1,2],3}.txt
我希望首先完成括号扩展,因此:
echo file[1,2].txt file3.txt
之后,我预计它会停在那里,因为 [1,2] 不是有效的通配符。但是,它给出了以下输出:
file[1.txt file2].txt file3.txt
为什么?
当前目录中的文件列表(命令结果ls
):
go.mod hello.sh hi main.go
因为您告诉它 :) 这是 bash 所看到的:
[
在这个上下文中,和没有]
特殊含义,glob 不会在括号扩展中扩展:如果括号扩展导致 glob,则该 glob 会在括号扩展后由 shell 进行评估。因此,这里发生的事情是,shell 在括号中看到三个逗号分隔的元素:
[1
,2]
和3
。这就是它适时打印出file[1.txt
,file2].txt
和 的原因file3.txt
。这与使用 之类的东西没什么不同file{a,b,c}.txt
。您可以看到它的发生
set -x
:此行为记录在给出优先顺序
EXPANSIONS
的部分中:man bash
顺便说一句,
[1,2]
这是一个完全有效的通配符模式,只是它没有在括号内展开。例如:请注意,在 globs 中,
[a,b]
匹配任意字符a
,,
或b
。它并不意味着“a 或 b”。