现在我真的很困惑perlbrew
...
在perlbrew.pm
中,我看到以下内容:
if ($shell =~ /\/zsh\d?$/) {
$shell_opt = "-d -f";
# <snip>
}
elsif ($shell =~ /\/bash$/) {
$shell_opt = "--noprofile --norc";
}
当然,$shell_opt
的这些设置意味着,至少如果从zsh
或bash
调用,perlbrew use ...
将exec
一个新的shell,* 抑制 * 所有用户的rc类型文件的来源。
我真的很难想象为什么 * 任何人 * 会想在一个裸露的 shell 工作。我在这里错过了什么?**perlbrew
的使用模式是否与通过shell进行的标准交互不同?或者它根本不适合zsh
或bash
的用户?
**编辑:**只是为了澄清,为了让我使用由perlbrew
安装的perl
之一,我必须运行以下代码
% perlbrew use perl-5.16.3
当你这样做的时候,上面显示的代码就会运行,结果是perlbrew
exec
是一个新的shell,* 没有rc-files*。我看不出在没有通常的rc文件的shell示例中工作有什么意义。
4条答案
按热度按时间nx7onnlm1#
**TL;DR:**您的
env
无法被perlbrew使用,需要修复。详情:
我遇到了同样的问题,运行
perlbrew switch ...
会产生一个裸露的bash shell。但我发现这是因为它与我安装perlbrew的会话相同。虽然我已经将它添加到.bash_profile中,但我没有在当前的shell中获取~/perl5/perlbrew/etc/bashrc
。(旁注:使用screen
使这一点变得更糟,因此我的会话在断开连接之间保持不变。)据我所知,
perlbrew
区分了两种情况:1.它已经拥有了它所需要的环境;即,您已采购
~/perl5/perlbrew/etc/bashrc
perlbrew switch ...
自动将perl
指向指定的版本。***没有派生任何子shell。***在注销之间仍然存在。1.您有一个裸shell,或者一个
perlbrew
无法使用的环境(例如,~/perl 5/perlbrew/etc/bashrc`没有被源化)。perlbrew
举起手来,生成一个新的子shell。这是当它执行您找到的--norc
代码时,并使用一个裸shell来填充它自己的环境变量。为什么项目想要在Senario #2中生成一个裸壳?是的,这是一个好问题,但我越想越觉得,我相信他们有他们的理由。我目前的看法是,
perlbrew
在这一点上正在寻找自己。您的环境(大概是由您的rc配置的)无法使用。在一个病态的情况下,也许它取消了所有它需要的环境变量。无论如何,子shell逻辑是确保perlbrew
按需运行的非常可靠的方法。最后一点注意-如果将
source ~/perl5/perlbrew/etc/bashrc
放入.bash_profile
意味着创建一个 * 新文件 *,那么您的.bashrc可能需要 * 显式 * 从该文件中获取,因为.profile
可能不再这样做:0aydgbwb2#
我不知道为什么会这样,但这段代码通常不会被执行。您必须显式执行
perlbrew
二进制文件才能从bash访问该代码。但是use
和switch
特性(调用包含引用代码的sub)通常由perlbrew
shell函数处理。4nkexdtk3#
编辑
别介意我:我没有意识到衍生的shell是交互式使用的。
一个运行在shell中的程序,如果它的源代码是rc文件,那么无论这些rc文件做什么,它都会被卡住。在一种病态的情况下,.bashrc可能会将
echo
别名为rm -rf
,导致随机删除一些不幸命名的文件和目录(并用垃圾错误填充控制台或日志文件)。perlbrew.pm
需要通过shell运行一些命令,并注意确保它不会因为某些rc文件中有奇怪的东西而意外地破坏任何东西。没有人类用户会想要在没有他们的rc文件的情况下工作。然而,人类可以补偿他们的个人设置与规范的差异。
perlbrew
不能。ef1yzkbh4#
您需要在脚本中获取perlbrew rc文件的源代码,以便在不启动子shell的情况下设置路径。
From:https://github.com/gugod/App-perlbrew/wiki/Perlbrew-In-Shell-Scripts: