shell别名何时生效?

shell别名何时生效?,shell,sh,posix,alias,Shell,Sh,Posix,Alias,我阅读了POSIX规范中的“别名替换”部分,但似乎无法理解这一部分 考虑以下两个脚本: alias x="echo hello" x 及 在我测试的两个shell(dash和zsh)中,它们都具有相同的行为。第一个脚本打印“hello”,第二个脚本生成错误,因为x不是命令 通过这些测试,别名似乎在POSIX语法中的下一个complete_命令开始时生效。如果这是POSIX规范中规定的情况,请参见 别名替换发生在解析期间(或至少在求值之前)。因为整个if语句是一个同时解析的复合命令,这意味着x在

我阅读了POSIX规范中的“别名替换”部分,但似乎无法理解这一部分

考虑以下两个脚本:

alias x="echo hello"
x

在我测试的两个shell(dash和zsh)中,它们都具有相同的行为。第一个脚本打印“hello”,第二个脚本生成错误,因为
x
不是命令

通过这些测试,别名似乎在POSIX语法中的下一个
complete_命令开始时生效。如果这是POSIX规范中规定的情况,请参见

别名替换发生在解析期间(或至少在求值之前)。因为整个
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 bye
。在解析并执行了
if
之后,
x
已经被重新定义,因此上述内容相当于

alias x="echo hello"
if true; then
    alias x="echo goodbye"
    echo hello
fi
echo goodbye

默认情况下,脚本中不会扩展别名。@IgnacioVazquez Abrams据我所知,这不是我测试的两个shell(sh和zsh)中的行为。我对POSIX规范中定义的行为感兴趣。
alias x="echo hello"
if true; then
    alias x="echo goodbye"
    echo hello
fi
echo goodbye