我在POSIX规范中读到了“别名替换”部分,但似乎无法解决这个问题。
考虑这两个脚本:
alias x="echo hello"
x
和
if true; then
alias x="echo hello"
x
fi
在我测试的两个shell(dash和zsh)中,两者都有相同的行为。第一个脚本打印“hello”,第二个脚本产生错误,因为x
不是命令。
从这些测试中,似乎别名在POSIX语法的下一个complete_command
开始时生效。如果是这种情况,它在POSIX规范中说明了吗?
答案 0 :(得分:0)
请参阅POSIX specification for alias substitution。
在解析期间(或者至少在评估之前)发生别名替换。因为整个if
语句是一次解析的一个复合命令,这意味着x
在之前经历了别名替换前面的alias
命令实际定义了别名,只能用 if
语句之前在完整命令行上定义的别名替换。
例如,考虑代码
alias x="echo hello"
if true; then
x
fi
解析后,将其转换为代码
alias x="echo hello"
if true; then
echo hello
fi
和 是实际执行的代码。
现在考虑
alias x="echo hello"
if true; then
alias x="echo goodbye"
x
fi
x
同样,在解析if
语句时,x
被定义为echo hello
,而不是echo goodbye
。 在解析并执行if
之后,x
已被重新定义,因此上述内容相当于
alias x="echo hello"
if true; then
alias x="echo goodbye"
echo hello
fi
echo goodbye