2012-03-14 65 views
1

我有一個艱難的時間搞清楚爲什麼下面的命令不被Perl中執行的命令..發佈系統在Perl

system(". ./setenv.sh"); 

我已經試過替代品,如

ALT 1 = system ".", "./setenv.sh"; 

ALT 2 = `. ./setenv.sh`; 

不知道我在做什麼錯.. 任何想法?

編輯:我有一些這裏提到的想法想通了,這是我做的..

system(". ./setenv.sh && <other commands that I required the env for here>"); 

謝謝!

+1

是你看到什麼樣的症狀,即,你怎麼知道是不是被執行呢? – Eric 2012-03-14 17:30:25

+1

第一點是什麼。 ? – kclair 2012-03-14 17:31:47

+0

當前目錄是否可以執行一個可執行命令?你想做什麼? – Zaid 2012-03-14 17:31:48

回答

7

.source(等同)是bash內部命令。系統調用會嘗試查找可執行文件(空間前的第一位),但找不到它(.不存在可執行文件,因爲它是bash內部命令)。

,你必須執行的bash(或您所使用的外殼),直接使用系統:

system ("/bin/bash ./setenv.sh"); 

但是,請注意,你想做什麼,除非setenv.sh有一定的副作用,沒有任何效果,因爲您剛剛執行system行後就開始讀取該環境。爲了建立perl程序的環境,你應該使用%ENV變量。

+0

最後三行中的你的想法與我的實現一起解決,謝謝! – simar 2012-03-15 15:57:39

2

.shell built-in(也稱爲source)。 system函數does not feed the arguments through a shell,至少不在基本情況下。這意味着您正在嘗試執行一個名爲.的常規命令,並且沒有這樣的命令。

有趣的是,當Perl通知shell裏面的一些shell元字符時,Perl會通過shell提供system參數,所以system(". setenv.sh | cat")就可以工作。

3

通過腳本名稱setenv.sh來判斷,看起來您可能預計在執行Perl腳本後將設置某些環境變量。

但是,您的shell腳本無權訪問父環境,並且在腳本退出時,所做的任何環境更改都會丟失。

缺少更改後的環境變量是否相信您的shell腳本未被執行?

欲瞭解更多信息,請參閱Can a shell script set environment variables of the calling shell?