如何使用zsh或bash perlbrew?

时间:2013-04-21 22:09:10

标签: bash perl zsh perlbrew

现在我真的perlbrew ...

感到困惑

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

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

AFAICT,$shell_opt的设置意味着,至少从zshbash调用,perlbrew use ...exec新的shell,抑制所有用户的rc类型文件的来源。

我真的很难想象为什么任何人想要在裸机上工作。 我在这里缺少什么? perlbrew是否意味着使用模式与通过shell的标准交互不同?或者它仅适用于zshbash

的用户

编辑:为了澄清一下,为了让我使用perl安装的perlbrew之一,我必须运行类似

的内容
% perlbrew use perl-5.16.3

当一个人这样做时,上面显示的代码就会运行,因此perlbrew exec是一个新的shell,没有rc-files 。没有我常用的rc文件,我没有看到在shell的实例中工作的重点。

4 个答案:

答案 0 :(得分:2)

不知道为什么会这样,但代码通常不会被执行。您必须显式执行perlbrew二进制文件才能从bash访问该代码。但useswitch功能(调用包含引用代码的子功能)通常由perlbrew shell函数处理。

答案 1 :(得分:2)

我有同样的问题,运行perlbrew switch ...会产生一个裸bash shell。但我发现这是因为它在我安装perlbrew的同一个会话中。虽然我已将它添加到.bash_profile,但我还没有在我当前的shell中找到~/perl5/perlbrew/etc/bashrc。 (旁注:使用screen会激怒这种情况,因此我的会话在断开连接之间一直存在。)

据我所知,perlbrew区分了两种情况:

  1. 它已经拥有了所需的环境;即,您已采购~/perl5/perlbrew/etc/bashrc

    • 在这种情况下,perlbrew switch ...会自动将perl指向指定的版本。 没有生成子shell。 在注销之间会一直存在。
  2. 您有一个裸机壳,或perlbrew无法使用的环境(例如,〜/ perl5 / perlbrew / etc / bashrc`尚未获取)。

    • 由于它无法在当前环境中运行,perlbrew会引起注意, 会产生新的子shell 。这是当它执行你找到的--norc代码时,并使用一个裸shell来填充它自己的环境变量。
    • 请注意,此方案也可能出现在脚本中。有关详细信息,请参阅Perlbrew in Shell Scripts
  3. 为什么该项目想要在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