如何在zsh或bash中使用perlbrew?

6

现在我对perlbrew感到非常困惑...

perlbrew.pm中,我看到以下内容:

    if ($shell =~ /\/zsh\d?$/) {
        $shell_opt = "-d -f";
        # <snip>
    }
    elsif  ($shell =~ /\/bash$/)  {
       $shell_opt = "--noprofile --norc";
    }

据我所知,$shell_opt 的这些设置意味着,至少如果从 zshbash 中调用,perlbrew use ... 将会 exec 一个新的 shell,禁止加载所有用户的rc类型文件。
我真的很难想象为什么任何人都想在一个裸壳中工作。这里有什么我不理解的吗?perlbrew 是用于与标准交互方式不同的使用模式吗?还是它只是不适用于zshbash的用户? 编辑: 为了澄清,为了使用由perlbrew安装的其中一个perl,我必须运行类似以下命令:
% perlbrew use perl-5.16.3

当你这样做时,上面显示的代码将被运行,结果是perlbrewexec会启动一个新的shell,没有rc文件。我不明白在没有我的常规rc文件的情况下使用my shell实例的意义所在。

我在bash中使用perlbrew。我只需要在.bashrc文件中添加一个源行。我不明白你的问题,你的安装出了什么问题? - squiguy
4个回答

3

简而言之:您的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. 你只能使用一个裸壳子,或其他不能被perlbrew使用的环境(例如:未加载 ~/perl5/perlbrew/etc/bashrc 文件)。
  • 由于它无法在当前环境下运行,perlbrew放弃了,并生成一个新的子shell。这时它执行了你发现的--norc代码,使用一个裸壳子填充自己的环境变量。
  • 请注意,此情况也可能发生在脚本中。有关更多信息,请参见Shell Scripts 中的 Perlbrew
在情景#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

不知道为什么会这样,但是那段代码通常不会被执行。你必须显式地从bash执行perlbrew二进制文件才能到达该代码。但是useswitch功能(调用包含引号代码的子程序)通常由perlbrew shell函数处理。


我仍然像以前一样感到困惑。据我所知,如果我想使用通过perlbrew安装的perl,我需要运行类似于perlbrew use perl-5.16.3的命令,这肯定会运行我指出的代码(我已经确认过了)。换句话说,我无法想象在不运行此代码的情况下如何使用perlbrew - kjo
如果它运行了你指定的代码,那么你的安装肯定有问题。你应该在你的.bashrc中引用一个脚本。 - ikegami

1

编辑

不要在意我:我没有意识到生成的 shell 是用于交互式的。


一个在shell中运行且已经加载了其rc文件的程序将被限制于这些rc文件所做的任何事情。在极端情况下,.bashrc可能会将echo别名为rm -rf,导致一些不幸命名的文件和目录被随机删除(并填充控制台或日志文件中的垃圾错误)。perlbrew.pm需要通过shell运行一些命令,并确保不会意外清除任何东西,因为某个rc文件中有奇怪的内容。
没有人类用户希望在没有他们的rc文件的情况下工作。然而,人类可以弥补他们的个人设置与标准不同的方式。 perlbrew则不能。

如果 shell 是由 perlbrew 使用的话,那么这就有意义了,但实际上它是由用户交互使用的。 - ikegami

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接