几周前我遇到了这个问题,但我认为这是我的系统出现问题。但经过几次调查后,我相信这可能是一个错误。或者也许我错了。当尝试在 CentOS7 上执行echo
或touch
操作多个文件时,例如:echo file{a..c}.txt
在 CentOS7 上执行此操作会返回,file{a..c}.txt
但在 RHEL7 上执行相同的命令会返回:filea.txt fileb.txt filec.txt
还有其他人有同样的问题吗?
答案1
如果 CentOS 系统上的 shell 是dash
,您会看到此行为,它不会像这样扩展大括号范围:
$ for shell in bash dash ksh
> do
> echo in $shell:
> $shell -c 'echo file{a..c}.txt'
> done
in bash:
filea.txt fileb.txt filec.txt
in dash:
file{a..c}.txt
in ksh:
filea.txt fileb.txt filec.txt
来自评论您在 CentOS 系统上使用 zsh。我可以通过设置 shell 选项来重现该行为ignorebraces
:
$ set -o|grep ignorebraces
ignorebraces off
$ echo {1..3}
1 2 3
$ set -o ignorebraces
$ echo {1..3}
{1..3}
$ set +o ignorebraces
$ echo {1..3}
1 2 3
答案2
这取决于您在各种系统上使用的 shell。
大括号扩展是 shell 的 POSIX 标准的扩展,但并非每个 shell 都实现它。那些这样做的人可能会以不同的方式来做。
shelldash
不实现大括号扩展:
$ echo {0..9}
{0..9}
$ echo {1,2,3}
{1,2,3}
shell pdksh
(在 OpenBSD 上找到)实现了大括号扩展,但不适用于范围:
$ echo {0..9}
{0..9}
$ echo {1,2,3}
1 2 3
bash
、zsh
和shell 实现范围ksh93
(数字和字母)
$ echo {0..9}
0 1 2 3 4 5 6 7 8 9
$ echo {1,2,3}
1 2 3