繁体   English   中英

如何在 zsh 或 bash 中使用 perlbrew?

[英]How to use perlbrew with zsh or bash?

现在我真的perlbrew感到困惑......

perlbrew.pm我看到以下内容:

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

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

我真的很难想象为什么有人会想在裸壳中工作。 我在这里缺少什么? perlbrew是否适用于与通过 shell 进行的标准交互不同的使用模式? 或者它根本不适合zshbash用户?

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

% perlbrew use perl-5.16.3

当这样做时,上面显示的代码就会运行,结果perlbrew exec是一个新的 shell,没有 rc-files 如果没有我常用的 rc 文件,我不认为在我的 shell 实例中工作有什么意义。

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

我遇到了同样的问题,运行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举起双手,并生成一个新的 subshel​​l 这是它执行您找到的--norc代码的时间,并使用一个裸壳在其中填充自己的环境变量。
    • 请注意,这种情况也可能出现在脚本中。 有关详细信息,请参阅Shell 脚本中的 Perlbrew

为什么该项目要在 Senario #2 中生成一个裸壳? 是的,这是一个很好的问题,但我想得越多,我相信他们有他们的理由。 我目前对此的看法是perlbrew在这一点上正在寻找自己。 您的环境,大概是由您的 rc 配置的,无法使用。 在病理情况下,也许它会取消设置它需要的所有环境变量。 无论如何,subshel​​l 逻辑是一种非常可靠的方式,可以确保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.

编辑

别介意我:我没有意识到生成的 shell 是交互使用的。


一个程序在一个 shell 中运行,它获得了它的 rc 文件,不管这些 rc 文件做什么。 在病理情况下, .bashrc 可能将echo别名为rm -rf ,导致随机删除一些不幸命名的文件和目录(并用垃圾错误填充控制台或日志文件)。 perlbrew.pm需要通过 shell 运行一些命令,并注意确保它不会意外地破坏任何东西,因为某些 rc 文件中有一些奇怪的东西。

没有人类用户会想在没有他们的 rc 文件的情况下工作。 然而,人类可以弥补他们的个人设置与规范的不同。 perlbrew不能。

您需要在脚本中获取 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM