现在我真的对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 use ...
将exec
新的shell,抑制所有用户的rc类型文件的来源。
我真的很难想象为什么任何人想要在裸机上工作。 我在这里缺少什么? perlbrew
是否意味着使用模式与通过shell的标准交互不同?或者它仅适用于zsh
或bash
编辑:为了澄清一下,为了让我使用perl
安装的perlbrew
之一,我必须运行类似
% perlbrew use perl-5.16.3
当一个人这样做时,上面显示的代码就会运行,因此perlbrew
exec
是一个新的shell,没有rc-files 。没有我常用的rc文件,我没有看到在shell的实例中工作的重点。
答案 0 :(得分:2)
不知道为什么会这样,但代码通常不会被执行。您必须显式执行perlbrew
二进制文件才能从bash访问该代码。但use
和switch
功能(调用包含引用代码的子功能)通常由perlbrew
shell函数处理。
答案 1 :(得分:2)
我有同样的问题,运行perlbrew switch ...
会产生一个裸bash shell。但我发现这是因为它在我安装perlbrew的同一个会话中。虽然我已将它添加到.bash_profile,但我还没有在我当前的shell中找到~/perl5/perlbrew/etc/bashrc
。 (旁注:使用screen
会激怒这种情况,因此我的会话在断开连接之间一直存在。)
据我所知,perlbrew
区分了两种情况:
它已经拥有了所需的环境;即,您已采购~/perl5/perlbrew/etc/bashrc
perlbrew switch ...
会自动将perl
指向指定的版本。 没有生成子shell。 在注销之间会一直存在。您有一个裸机壳,或perlbrew
无法使用的环境(例如,〜/ perl5 / perlbrew / etc / bashrc`尚未获取)。
perlbrew
会引起注意, 会产生新的子shell 。这是当它执行你找到的--norc
代码时,并使用一个裸shell来填充它自己的环境变量。 为什么该项目想要在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.
答案 2 :(得分:1)
别介意我:我没有意识到生成的shell是以交互方式使用的。
在shell中运行的程序源自其rc文件,无论这些rc文件是什么,都会遇到困难。在病态情况下,.bashrc可能将echo
别名为rm -rf
,从而导致随机删除一些不幸命名的文件和目录(并使用垃圾错误填充控制台或日志文件)。 perlbrew.pm
需要通过shell运行一些命令,并且注意确保它不会意外地破坏任何东西,因为某些rc文件中有一些奇怪的东西。
没有他们的rc文件,没有人类用户会想要工作。然而,人类可以弥补他们的个人设置与常规的不同。 perlbrew
不能。
答案 3 :(得分:0)
您需要在脚本中获取perlbrew rc文件,以便在不启动子shell的情况下设置路径。
来自:https://github.com/gugod/App-perlbrew/wiki/Perlbrew-In-Shell-Scripts:
#!/bin/bash
## These 3 lines are mandatory.
export PERLBREW_ROOT=/opt/perlbrew
export PERLBREW_HOME=/tmp/.perlbrew
source ${PERLBREW_ROOT}/etc/bashrc
## Do stuff with 5.14.1
perlbrew use 5.14.1
perl /app/my-modern-program