zsh 在传递给程序之前如何扩展变量?

zsh 在传递给程序之前如何扩展变量?

zsh 的基本规则是不需要引用变量,例如:

% data="single argument"
% print -l $data
single argument

我知道的一个例外是,如果一个参数即使是空的也不能被跳过,那么它必须用双引号引起来:

% emptyarg=
% functon count() { echo $# }
% count $emptyarg
0
% count "$emptyarg"
1

但是,如果参数包含某些特殊字符,则必须将其加引号,否则 shell 会出错。这是为什么?看起来很脆弱。我的数据内容不应显着影响函数/命令的运行方式。

答案1

回答我自己的问题 - 我注意到该行为在脚本中按预期工作(即使没有引号,参数也不会扩展)。我意识到问题可能是由某个选项引起的,因此我setopt在交互式 shell 和脚本中运行并比较了结果。我把它们一一关闭,直到发现setopt noglobsubst达到了预期的效果。简而言之,该GLOB_SUBST选项使 zsh 将所有变量视为要在可能的情况下扩展的模式。您可以禁用此选项,并在需要时使用波形符参数扩展来扩展变量~

% setopt noglobsubst
% star=*
% echo $star
*
% echo $~star
readme.txt test.sh

相关内容