shell别名何时生效?

时间:2018-05-02 19:41:51

标签: shell sh posix alias

我在POSIX规范中读到了“别名替换”部分,但似乎无法解决这个问题。

考虑这两个脚本:

alias x="echo hello"
x

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

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

从这些测试中,似乎别名在POSIX语法的下一个complete_command开始时生效。如果是这种情况,它在POSIX规范中说明了吗?

1 个答案:

答案 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