【问题标题】:Issuing system commands in perl在 perl 中发出系统命令
【发布时间】:2012-03-14 17:28:15
【问题描述】:

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

谢谢!

【问题讨论】:

  • 你看到什么样的症状,即,你怎么知道它没有被执行?
  • 第一个有什么意义。 ?
  • 当前目录.是否可以成为可执行命令?你想做什么?
  • 它正在执行,但它没有做任何有用的事情,因为环境变量通过进程树向下传播,而不是向上传播。

标签: perl bash shell unix


【解决方案1】:

.source(等效项)是 bash 内部命令。系统调用试图找到可执行文件(空格前的第一位)但没有找到(. 不作为可执行文件存在,因为它是 bash 内部命令)。

您必须直接使用系统执行 bash(或您正在使用的 shell):

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

但是,请注意,除非 setenv.sh 有一些副作用,否则您正在尝试执行的操作没有任何效果,因为您开始读取该环境的 shell 在执行 @ 后就死了987654327@ 线。要为您的 perl 程序建立环境,您应该使用 %ENV 变量。

【讨论】:

  • 你在最后三行的想法在我的实现中得到了体现,谢谢!
【解决方案2】:

从脚本名称来看,setenv.sh,您可能期望在执行 Perl 脚本后设置某些环境变量。

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

您认为您的 shell 脚本没有被执行的理由是缺少更改的环境变量吗?

欲了解更多信息,请参阅Can a shell script set environment variables of the calling shell?

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2013-06-25
      • 2015-04-05
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多