使用本地::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
因此与一些已有十年历史的系统不兼容。 export
Csh 需要不同的语法; local::lib 如果$SHELL
包含csh
作为子字符串,则发出 csh 语法。在 Windows 下,local::lib 生成等效的 cmd 语法;因为 cmd 没有等效的 .