现在我真的对perlbrew
感到困惑...
在 perlbrew.pm
中,我看到以下内容:
if ($shell =~ /\/zsh\d?$/) {
$shell_opt = "-d -f";
# <snip>
}
elsif ($shell =~ /\/bash$/) {
$shell_opt = "--noprofile --norc";
}
AFAICT,$shell_opt
的那些设置意味着,至少如果从 zsh
或 bash
调用,perlbrew 使用 .. .
将执行
一个新的 shell,抑制所有用户的 rc 类型文件的来源。
我真的很难想象为什么任何人 都想在裸机中工作。 我在这里遗漏了什么?perlbrew
是否意味着不同于通过 shell 进行的标准交互的使用模式?或者它根本不适合 zsh
或 bash
的用户?
编辑: 澄清一下,为了让我使用 perlbrew
安装的 perl
之一,我必须运行像
% perlbrew use perl-5.16.3
当这样做时,上面显示的代码会运行,结果 perlbrew
exec
是一个新的 shell,没有 rc 文件。如果没有我常用的 rc 文件,我看不出在我的 shell 实例中工作有什么意义。
最佳答案
我遇到了同样的问题,运行 perlbrew switch ...
生成了一个裸 bash shell。但我发现这是因为它在我安装 perlbrew 的同一个 session 中。虽然我已经将它添加到 .bash_profile,但我没有在我当前的 shell 中获取 ~/perl5/perlbrew/etc/bashrc
。 (旁注:使用 screen
会激怒这种情况,因此我的 session 在断开连接之间持续存在。)
据我所知,perlbrew
区分两种情况:
它已经具备了它所需要的环境;即,您已经获取了
~/perl5/perlbrew/etc/bashrc
- 在这种情况下,
perlbrew switch ...
自动将perl
指向指定的版本。 没有生成子 shell。这在注销之间持续存在。
- 在这种情况下,
您有一个裸壳,或者
perlbrew
无法使用的环境(例如,~/perl5/perlbrew/etc/bashrc` 尚未获取)。- 由于它不能在当前环境中运行,
perlbrew
举起手来,生成一个新的子 shell。这是当它执行您找到的--norc
代码时,并使用一个裸壳,它在其中填充自己的环境变量。 - 请注意,这种情况也可能发生在脚本中。参见 Perlbrew in Shell Scripts了解更多信息。
- 由于它不能在当前环境中运行,
为什么该项目要在 Senario #2 中生成一个裸壳?是的,这是一个很好的问题,但我想得越多,我相信他们有他们的理由。我目前对此的看法是 perlbrew
在这一点上正在寻找自己。您的环境(可能是由您的 rc 配置的)无法使用。在病态的情况下,它可能会取消设置它需要的所有环境变量。无论如何,子 shell 逻辑是确保 perlbrew
将按需要运行的非常可靠的方法。
最后一点 - 如果将 source ~/perl5/perlbrew/etc/bashrc
放入 .bash_profile
意味着创建一个新文件,那么您的 .bashrc 可能需要显式来自该文件,因为 .profile
可能不再这样做:
$ head -3 .profile # ~/.profile: executed by the command interpreter for login shells. # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login # exists.
关于bash - 如何将 perlbrew 与 zsh 或 bash 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16136735/