6

现在我真的很困惑perlbrew……

perlbrew.pm我看到以下内容:

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

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

我真的很难想象为什么有人愿意在裸壳中工作。 我在这里想念什么? 是否perlbrew意味着与通过外壳的标准交互不同的使用模式?或者它根本不适合zshor的用户bash

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

% perlbrew use perl-5.16.3

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

4

4 回答 4

2

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

于 2013-04-21T22:30:23.257 回答
2

我有同样的问题,运行perlbrew switch ...产生了一个裸露的 bash shell。但我发现这是因为它在我安装 perlbrew 的同一会话中。虽然我已将它添加到 .bash_profile,但我并没有~/perl5/perlbrew/etc/bashrc在我当前的 shell 中进行采购。(旁注:这被使用激怒了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.
于 2015-10-09T15:47:59.720 回答
1

编辑

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


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

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

于 2013-04-21T22:19:31.400 回答
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
于 2017-02-01T00:15:23.657 回答