别名允许的字符

别名允许的字符

库存标准的行为如下,其中zsh包含别名,例如:-a-a

% zsh -f
svelte% alias a-a=date
svelte% a-a
Sun 19 Jul 2020 17:20:05 +07

我的配置的行为如下:

% alias a-a=date       
% alias | grep a-a
a-a=date
% a-a
zsh: command not found: a-a

非连字符别名工作正常。

什么选项会导致zsh找不到以连字符命名的别名?

答案1

除了工作别名在 zsh: 中无法接受的基本 10 个字符之外"&');<>`|,设置该选项posixaliases还添加了 12 个字符

#$(*-?[\]^{~

其中包括破折号-,没有 则有效posixaliases

别名选项

zsh 中有几个影响别名的选项:

ALIASES ALIAS_FUNC_DEF POSIX_ALIASES

aliases选项启用全部或全部不启用,而不是仅控制的选项a-b

aliasfuncdef与函数定义的解析方式更相关。

后缀别名

因此,唯一剩下的尝试就是posixaliases。该男子的描述是:

设置此选项后,保留字不是别名扩展的候选者:

似乎不适用于这个问题。

POSIX 定义的别名

然而,知道POSIX 的描述alias

3.10 别名

在 shell 命令语言中,仅由可移植字符集中的下划线、数字和字母以及以下任意字符组成的单词:“!”、“%”、“,”、“@”。

实现可能允许别名中的其他字符作为扩展名。

也就是说:对于 POSIX,可用字符列表是_0-9a-zA-Z!%,@
该描述不包括破折号-,即使它被允许作为扩展名。

因此,a 可能在某种程度上posix_alias具有限制性。 事实上,确实如此。alias

别名允许的字符

一般来说, 的有效字符列表alias有些晦涩难懂且难以找到。实际上,它似乎允许所有 Unicode 字符:

% for  c in ä å é ë þ ü ú í ó ö á ß ð f g h ï œ ø ¶ æ œ © ® b ñ µ ç;
> do   d=a${c}b; 
>      alias $d="echo alias $d";
> done
% alias
a©b='echo alias a©b'
a®b='echo alias a®b'
aµb='echo alias aµb'
a¶b='echo alias a¶b'
aáb='echo alias aáb'
aßb='echo alias aßb'
aäb='echo alias aäb'
aåb='echo alias aåb'
aæb='echo alias aæb'
açb='echo alias açb'
aéb='echo alias aéb'
aëb='echo alias aëb'
aíb='echo alias aíb'
aïb='echo alias aïb'
aðb='echo alias aðb'
añb='echo alias añb'
aób='echo alias aób'
aöb='echo alias aöb'
aøb='echo alias aøb'

但 zsh 在使用 ASCII 字符时受到更多限制:

% for c in ! @ % +; do d=a${c}b; alias $d="echo alias $d"; done

a!b只有在引用为时才有效a\!b,并且某些字符# $ ^ *不能轻易使用(上面未使用)。

事实上,{\ ..~}可以测试整个 ASCII 列表来定义别名:

for c in {\ ..~}; do d="a${c}b"; alias $d="echo alias ${(q)d}";done

但只有一些别名真正有效:

for c in {\ ..~}; do d="a${c}b"; if e=$(eval $d) 2>/dev/null; then print $d $e; else print "failed char: $c"; fi; done

我们得到 10 个失败的字符:"&');<>`|,一些语法字符可以定义为别名,但不起作用(不带引号):,一些字符是在文件系统中搜索的<=>&;模式字符,并且一些别名被错误地定义[?未引用的字符:\`$#.

在 POSIX 别名中,只有“普通不带引号的字符”可能有效,在 zsh 中,设置posixaliases强制定义,使 12 个附加字符直接出现failed chars在上面的测试中:

#$(*-?[\]^{~

这些字符不能用于工作别名。其中包括-,即您的问题的来源。

man zsh

当设置 POSIX_ALIASES 时,只有普通的不带引号的字符串才有资格使用别名。内置别名不会拒绝不合格的别名,但不会扩展它们。

答案2

简单的答案是setopt aliases(正如您没有提到的那样,无连字符别名是否继续有效)。

不那么简单的一个 - 你没有加载任何数学/计算第三方插件,这可能会将这样的交互式行视为“a减a”吗?

由于您显然拥有庞大而复杂的配置(谁没有......),请首先禁用所有外部代码(例如 zsh-lovers 技巧),因为它是最可能的干扰源,而不是 zsh 选项本身。

相关内容