You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell别名应在解析时还是执行时进行替换?

Shell函数中别名的解析差异问题

考虑如下脚本:

alias al='echo A'
foo(){ echo $(al);}
alias al='echo B'
foo

bash、ksh和zsh执行该脚本会输出B,而dash和yash则输出A。

哪种结果是正确的?还是两种结果都符合规范?

根据POSIX标准(Shell & Utilities卷)中2.3.1 别名替换的规定:

在标记被分隔后、应用Shell语法规则之前,应检查被识别为简单命令的命令名字词,判断其是否为未加引号的有效别名。

从这段规定来看,似乎别名应该在函数定义时就完成解析——毕竟在应用语法规则之前,shell无法判断这段代码是在函数内部。但这又存在逻辑矛盾:因为在应用语法规则之前,shell同样没办法识别某个字词是不是命令名字词。

内容的提问来源于stack exchange,提问作者anonymous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:35:14