eval 和 alias 命令之间的区别

eval 和 alias 命令之间的区别

evalalias命令之间有什么区别?

例子:

x=‘ls -d -l $HOME’
$x
eval $x

alias y=‘ls -l -d $HOME’
y

答案1

主要是语义。虽然将命令字符串组合到变量中对于脚本编写很有用,但对于别名来说并不好。一个明显的原因是完成 - 虽然各种完成脚本,例如bash_completion可能能够处理别名(遗憾的是从来没有发生过我的情况),使它们假设变量可扩展为命令可能会使其在某种程度上变得混乱。

第二个原因是alias允许您创建命令快捷方式,而无需使用任何魔法命令或字符(如$运行它们)。这样,替换是透明的,并且允许覆盖某些程序的默认设置。一个很好的例子是ls,它通常被默认为别名ls --color=auto。用户不必知道这一点即可看到彩色输出。一些发行版的别名rm和相关命令为rm -i,因此它们在交互模式下工作并且可以防止意外删除。

另一方面,变量对于某些不需要模仿二进制文件的用途可能很有用。一个广泛且很好的例子是EDITOR环境变量。它不仅可以使用 运行您最喜欢的编辑器$EDITOR,还可以使其他程序(可能无法访问 shell)能够运行它,并从其执行环境中获取它的值。

可能还有其他一些我不知道的事情,但结果是相同的:这些命令将按其预期使用。

答案2

别名不能在脚本中使用(在非交互式 shell 中默认禁用。您甚至可以组合多个别名(例如用于 eval 的多个字符串)。但是别名不会为您提供从命令中获得的良好间接级别行被解析两次:

text1=foo; text2=bar; text3=fubar
for((i=1;i<4;i++)); do
  eval echo \$text${i}
done

我承认这可以在没有 eval() 的情况下完成varname=text${i}; echo ${!varname}。但在构建命令时我总是会使用 eval。

shell-expand-line (MCe) 两者都可以工作,不会出现错误。 :-)

相关内容