我一直在使用我的C ++程序中的linux exec()函数,我正在尝试执行脚本(perl,python,php,...)。
从bash我可以执行例如:sh -c“perl /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方法,因此解释器的路径会自动解决...
有谁可以指出我做错了什么?
答案 0 :(得分:2)
在第一个示例中,您尝试执行名为"perl
的程序,提供文件/home/ignition/test.pl"
作为第一个参数。直接使用shell时,它会在启动程序之前删除引号。
试试这个:execl("/bin/sh", "sh", "-c", "perl /home/ignition/test.pl", NULL);
答案 1 :(得分:1)
使用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
二进制文件并且不依赖于硬编码位置(您几乎可以肯定{{1} }))。