2012-03-14 69 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?