2013-04-21 64 views
4

現在我真的困惑perlbrew ...如何用zsh或bash使用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的用戶?

編輯:只是爲了澄清,爲了讓我使用由perlbrew安裝perl S的一個我不得不運行類似

% perlbrew use perl-5.16.3 

當一個人這樣做,上面顯示的代碼得到運行,並因此perlbrewexec'一個新的外殼,沒有rc文件。我沒有看到在沒有我慣用的rc文件的情況下在我的shell實例中工作的要點。

+0

我'bash'使用'perlbrew'。我所要做的只是在我的'.bashrc'文件中添加一個源代碼行。我不遵循你的問題。你的安裝出了什麼問題? – squiguy 2013-04-21 22:26:55

回答

1

編輯

不介意我:我沒有意識到生成的shell是交互使用的。


在已經採購了RC-文件外殼程序的運行被套牢無論這些RC-文件執行。在病態情況下,.bashrc可能會將別名echo改爲rm -rf,從而導致一些不幸命名的文件和目錄(以及用無用錯誤填充控制檯或日誌文件)的隨機刪除。 perlbrew.pm需要通過shell運行一些命令,並且要小心確保它不會意外地造成任何問題,因爲某些rc文件有些奇怪的東西。

沒有人類用戶會希望沒有他們的rc文件工作。然而,人類可以補償他們的個人設置與標準不同。 perlbrew不能。

+0

如果shell被perlbrew使用,它是有意義的,但它實際上是由用戶交互使用的。 – ikegami 2013-04-21 22:28:42

+0

在這種情況下,我真的不知道... – michaelb958 2013-04-21 22:52:14

2

不知道爲什麼它是這樣的,但代碼通常不會執行。您必須明確執行perlbrew二進制才能從bash中獲取該代碼。但useswitch功能(它調用包含引用代碼的子功能)通常由perlbrew shell功能處理。

+0

我仍然像以前一樣困惑。 AFAICT,如果我想用'perl'來安裝''perlbrew',我需要運行'perlbrew use perl-5.16.3'之類的東西,而這個***肯定會運行我指出的代碼(我證實了這一點)。 IOW,我無法看到如何在不運行此代碼的情況下使用'perlbrew'。 – kjo 2013-04-21 23:37:50

+0

如果運行您指定的代碼,安裝時出現問題。你應該在你的'.bashrc'中找到一個腳本。 – ikegami 2013-04-21 23:57:44

1

我有同樣的問題,其中運行perlbrew switch ...產生了一個光禿禿的shell。但我發現這是因爲它在我安裝perlbrew的同一個會話中。雖然我已將它添加到.bash_profile,但我還沒有在我的當前shell中找到~/perl5/perlbrew/etc/bashrc。 (邊注:這是因爲使用screen而激怒了,所以我的會話在斷開連接之間持續存在。)

據我所知,perlbrew區分這兩種情況之間:

  1. 它已經擁有它所需要的環境;即,你已經採購~/perl5/perlbrew/etc/bashrc

    • 在這種情況下,perlbrew switch ...自動地指出perl到指定的版本。 沒有生成子外殼。這在註銷之間依然存在。
  2. 你有一個裸露的殼,或通過環境否則perlbrew不可用(例如,〜/的perl5/perlbrew的/ etc/bashrc`尚未來源)。

    • ,因爲它不能在當前的環境中運行,perlbrew拋出其雙手,並產生一個新的子shell。這是當它執行你找到的代碼時,它使用一個裸機來裝入它自己的環境變量。
    • 請注意,這種情況也可能發生在腳本中。有關更多信息,請參閱Perlbrew in Shell Scripts

爲什麼這個項目要產卵在塞納里奧#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. 
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