【问题标题】:executing perl/python/... scripts using exec()使用 exec() 执行 perl/python/... 脚本
【发布时间】:2011-11-21 10:42:45
【问题描述】:

我一直在我的 C++ 程序中使用 linux exec() 函数,我正在尝试执行脚本(perl、python、php、...)。

从 bash 我可以执行例如:sh -c "p​​erl /home/ignition/test.pl"

但是

execl("/bin/sh", "sh", "-c", "\"perl /home/ignition/test.pl\"", NULL);

不起作用。这确实有效:

execl("/bin/sh", "sh", "-c", "/home/ignition/test.pl", NULL);

但这依赖于 perl 解释器的正确路径被指定为脚本的第一行,这不是很通用,例如这不适用于 php 脚本。我想使用 sh -c 方法,以便自动解析解释器的路径...

谁能指出我做错了什么?

【问题讨论】:

  • 你试过没有多余的引号吗?
  • 我以为我已经尝试过了,但我想我没有。现在可以用了,谢谢。

标签: c++ linux exec


【解决方案1】:

在第一个示例中,您尝试执行名为"perl 的程序,并提供文件/home/ignition/test.pl" 作为第一个参数。当您直接使用 shell 时,它会在启动程序之前删除引号。

试试这个:execl("/bin/sh", "sh", "-c", "perl /home/ignition/test.pl", NULL);

【讨论】:

    【解决方案2】:

    在使用exec 函数时,您不需要在包含空格的参数周围使用引号。试试:

    execl("/bin/sh", "sh", "-c", "perl /home/ignition/test.pl", NULL);
    

    或者,您可以更改脚本中的 shebang 行,如下所示:

    #!/usr/bin/perl -w
    

    #!/usr/bin/env perl -w
    

    env 程序知道如何搜索PATH 以找到perl 二进制文件,并且不依赖硬编码位置(您几乎可以确定/usr/bin/env 存在)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 2023-03-15
      • 2012-12-08
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 2012-10-20
      相关资源
      最近更新 更多