shell别名何时生效?
我阅读了POSIX规范中的“别名替换”部分,但似乎无法理解这一部分 考虑以下两个脚本: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在
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