[英]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
设置意味着,至少如果从zsh
或bash
调用, $shell_opt
perlbrew use ...
将exec
一个新的 shell,抑制所有用户的 rc 类型文件的来源。
我真的很难想象为什么有人会想在裸壳中工作。 我在这里缺少什么? perlbrew
是否适用于与通过 shell 进行的标准交互不同的使用模式? 或者它根本不适合zsh
或bash
用户?
编辑:只是为了澄清,为了让我使用perlbrew
安装的perl
之一,我必须运行类似的东西
% perlbrew use perl-5.16.3
当这样做时,上面显示的代码就会运行,结果perlbrew
exec
是一个新的 shell,没有 rc-files 。 如果没有我常用的 rc 文件,我不认为在我的 shell 实例中工作有什么意义。
不知道为什么会这样,但通常不会执行该代码。 您必须显式执行perlbrew
二进制文件才能从 bash 访问该代码。 但是use
和switch
特性(调用包含引用代码的 sub )通常由perlbrew
shell 函数处理。
我遇到了同样的问题,运行perlbrew switch ...
产生了一个裸露的 bash shell。 但我发现这是因为它在我安装 perlbrew 的同一个会话中。 虽然我已经将它添加到 .bash_profile,但我没有在当前的 shell 中找到~/perl5/perlbrew/etc/bashrc
。 (旁注:这被使用screen
激怒了,所以我的会话在断开连接之间持续存在。)
据我所知, perlbrew
区分了两种情况:
它已经有了它需要的环境; 即,您已经获取了~/perl5/perlbrew/etc/bashrc
perlbrew switch ...
自动将perl
指向指定的版本。 没有产生子shell。 这在注销之间持续存在。 你有一个裸露的外壳,或通过环境,否则无法使用perlbrew
(例如,〜/的perl5 / perlbrew的/ etc / bashrc`尚未来源)。
perlbrew
举起双手,并生成一个新的 subshell 。 这是它执行您找到的--norc
代码的时间,并使用一个裸壳在其中填充自己的环境变量。 为什么该项目要在 Senario #2 中生成一个裸壳? 是的,这是一个很好的问题,但我想得越多,我相信他们有他们的理由。 我目前对此的看法是perlbrew
在这一点上正在寻找自己。 您的环境,大概是由您的 rc 配置的,无法使用。 在病理情况下,也许它会取消设置它需要的所有环境变量。 无论如何,subshell 逻辑是一种非常可靠的方式,可以确保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.