为什么我不能使用 execl() 来 运行 一个 bash 脚本?

Why can't I use execl() to run a bash script?

我正在尝试从 raspberry pi 上的网站按钮 运行 一个 bash 脚本,该脚本位于 home/pi/。下面的代码片段显示了我当前的解决方案。每当按下网站按钮时,它都会在 c 文件中调用此代码块。

else if(strcmp(argv[1],"SelfTest") == 0)
    {
        char *command = "/bin/bash";
        char name[40];
        strcpy(name, "home/pi/SelfTest.sh");
        execl(command, command, name, NULL);
        return 0;
    }

我 运行 在 Raspberry Pi 3+ 上安装这个,我 运行ning 的脚本有 777 个权限,归 pi:www-data 所有,如果有帮助的话。

我测试了 IF 块是否真的被调用,只是让它创建一个名为 'TEST' 的空目录。底部的代码片段显示了我是如何接近它的。这似乎没有问题(只要我按下网站上的按钮,我 'ls' home/pi/ 就会出现一个名为 'TEST' 的新文件夹)。不幸的是,当我 运行 最上面的代码片段(到 运行 SelfTest.sh)时,脚本不会 运行(脚本本身应该将输出记录到带有时间戳的日志文件,按下按钮不会更新时间戳。时间戳仅在我 运行 来自终端的脚本时更新)

else if(strcmp(argv[1],"SelfTest") == 0)
    {
        char *command = "/bin/mkdir";
        char name[40];
        strcpy(name, "/home/pi/TEST");
        execl(command, command, name, NULL);
        return 0;
    }

每次我按下网站按钮时应该发生的是它应该 运行 SelfTest.sh。我应该能够通过阅读日志文件来验证这一点,但是当我按下网站按钮时它永远不会更新。

如果您需要任何额外信息,请告诉我!

除非您是 运行 来自 / 的,否则此行在 home:

之前缺少斜线
strcpy(name, "home/pi/SelfTest.sh");

此外,execl 永远不会 return。您可能需要查找有关 fork()exec() 模式的信息。

显然我超级笨拙,没有意识到我不需要 bash。我按预期将 'char *command = "/bin/bash";' 更改为 'char *command = "/bin/sh";' 和脚本 运行!