在perl中发出系统命令

时间:2012-03-14 17:28:15

标签: perl bash shell unix

我很难弄清楚为什么以下命令没有在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>");

谢谢!

3 个答案:

答案 0 :(得分:7)

.source(等效)是bash内部命令。系统调用尝试查找可执行文件(空格前的第一位)并且找不到它(.不存在可执行文件,因为它是bash内部命令。)

您必须直接使用system:

执行bash(或您正在使用的shell)
system ("/bin/bash ./setenv.sh");

但是,请注意您尝试做的事情,除非setenv.sh有一些副作用,但没有效果,因为您开始阅读该环境的shell在执行后就会死亡system行。要为perl程序建立环境,您应该使用%ENV变量。

答案 1 :(得分:3)

根据脚本的名称setenv.sh判断,您可能希望在执行Perl脚本后设置某些环境变量。

但是,您的shell脚本无权访问父环境,并且当脚本退出时,它所做的任何环境更改都会丢失。

缺少更改的环境变量是否是您认为shell脚本未被执行的原因?

有关详细信息,请参阅Can a shell script set environment variables of the calling shell?

答案 2 :(得分:2)

.shell built-in(也称为source)。 system函数does not feed the arguments through a shell,至少不在基本情况下。这意味着您正在尝试执行名为.的常规命令,并且没有这样的命令。

有趣的是,Perl会在内部注意到一些shell元字符时通过shell提供system参数,因此system(". setenv.sh | cat")将起作用。例如。