为什么 local::lib shell 代码使用 eval 和 $()

为什么 local::lib shell 代码使用 eval 和 $()

使用本地::lib要求您添加一行~/.shellrc

eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)

我不明白使用eval, 并将语句包含在其中的意义$()是什么。我还注意到这csh并不要求您使用这些。所以我想知道有什么区别,以及我是否应该将其用于通用 bourne shell 或zsh.

答案1

perl -I$HOME/perl5/lib/perl5 -Mlocal::lib打印出一些 shell 代码。要点eval $(…)是在当前 shell 的上下文中执行该代码。这通常用于设置环境变量。您不能为此使用子流程,因为这只会影响子流程的环境。您可以获取一个片段:

. /path/to/snippet-containing-variable-definitions

但只有当生成变量值的代码是用 shell 编写时才有效。这里的代码是用 Perl 编写的,因此 Perl 代码生成 shell 代码。

暗色与许多其他程序一样,使用相同的技术。

shell 片段通常非常简单,只是变量赋值(值的纯字符串)和export语句,因此它们与所有 Bourne 风格的 shell(包括任何 POSIX shell)和 zsh 兼容。由于它与赋值相结合(POSIX 允许,但原始 Bourne shell 不允许),local::lib因此与一些已有十年历史的系统不兼容。 exportCsh 需要不同的语法; local::lib 如果$SHELL包含csh作为子字符串,则发出 csh 语法。在 Windows 下,local::lib 生成等效的 cmd 语法;因为 cmd 没有等效的 .

相关内容