如何在zsh或bash中使用perlbrew?

58wvjzkj  于 2023-05-07  发布在  Perl
关注(0)|答案(4)|浏览(192)

现在我真的很困惑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类型文件的来源。
我真的很难想象为什么 * 任何人 * 会想在一个裸露的 shell 工作。我在这里错过了什么?**perlbrew的使用模式是否与通过shell进行的标准交互不同?或者它根本不适合zshbash的用户?

**编辑:**只是为了澄清,为了让我使用由perlbrew安装的perl之一,我必须运行以下代码

% perlbrew use perl-5.16.3

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

nx7onnlm

nx7onnlm1#

**TL;DR:**您的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.您有一个裸shell,或者一个perlbrew无法使用的环境(例如,~/perl 5/perlbrew/etc/bashrc`没有被源化)。

  • 由于它不能在当前环境中运行,perlbrew举起手来,生成一个新的子shell。这是当它执行您找到的--norc代码时,并使用一个裸shell来填充它自己的环境变量。
  • 请注意,这种情况也可能发生在脚本中。有关详细信息,请参阅Perlbrew in Shell Scripts

为什么项目想要在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.
0aydgbwb

0aydgbwb2#

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

4nkexdtk

4nkexdtk3#

编辑

别介意我:我没有意识到衍生的shell是交互式使用的。
一个运行在shell中的程序,如果它的源代码是rc文件,那么无论这些rc文件做什么,它都会被卡住。在一种病态的情况下,.bashrc可能会将echo别名为rm -rf,导致随机删除一些不幸命名的文件和目录(并用垃圾错误填充控制台或日志文件)。perlbrew.pm需要通过shell运行一些命令,并注意确保它不会因为某些rc文件中有奇怪的东西而意外地破坏任何东西。
没有人类用户会想要在没有他们的rc文件的情况下工作。然而,人类可以补偿他们的个人设置与规范的差异。perlbrew不能。

ef1yzkbh

ef1yzkbh4#

您需要在脚本中获取perlbrew rc文件的源代码,以便在不启动子shell的情况下设置路径。
From: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

相关问题