库存标准的行为如下,其中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 选项本身。