我很难弄清楚为什么以下命令没有在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>");
谢谢!
答案 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")
将起作用。例如。