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
相关产品推荐
相关产品推荐

