ls: 无法访问 'PATH=./': 没有那个文件或目录

ls: cannot access 'PATH=./': No such file or directory

我刚开始使用 linux 和 bash 命令行,但我想看看我是否可以从 c 文件执行基本的 bash 命令(或程序)。我的代码非常简单,我可以发誓它正在运行,但突然间它甚至不承认该路径存在。

char* arg[] = {"ls", "-l"};
char* environ[] = {"PATH=./", (char*)0};
execve("/bin/ls", arg, environ);/*execute the command 'ls -l' in curdir*/

我尝试设置为 PATH=/bin 但它甚至没有执行该目录中的命令。它只是 returns 一个类似的错误。

注意:我试过了

char* environ[] = {"PATH=./", NULL};

我什至尝试过使用 main() 中的 envp,但仍然不起作用。

将 NULL 放在 arg 数组的末尾。

char* arg[] = {"ls", "-l", NULL};

NULL用于标记数组的结束。

这个错误信息...

ls: cannot access 'PATH=./': No such file or directory

... 表示 ls 实用程序正在尝试访问名为“PATH=./”的文件,但它找不到。这是您的代码引起的未定义行为的表现...

char* arg[] = {"ls", "-l"};
char* environ[] = {"PATH=./", (char*)0};
execve("/bin/ls", arg, environ);/*execute the command 'ls -l' in curdir*/

... 由于 execve() 期望并依赖 arg 指向的参数列表被空指针终止。

虽然试图合理化或解释未定义的行为有点令人担忧,但您可以想象数组 argenviron 的内容在内存中一个接一个地排列,所以这两者的组合表示与 char * 的四元素数组的表示相同。此视图可能有助于理解为什么 argenv 数组必须首先由空指针终止。

修复方法是将空指针附加到 arg 的值:

char* arg[] = {"ls", "-l", NULL};

另请注意,在这种特殊情况下,指定环境没有明显优势,因此您可以改用 execv() 来简化。

还要注意,/ 本身以外的路径元素不应包含尾随 / 字符。这不是目录的正确名称的一部分,虽然您通常可以不用它,但它的格式很差。

请总是post一个完整的程序。

如手册页和上面的评论所述,您需要在参数列表末尾添加一个 NULL

您不需要在 envp[] 中传递任何内容,因为您 运行 只是 ls

按照惯例,您应该在 argv[0]

中传递可执行文件的完整路径

简而言之,这有效

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    char* arg[] = { "/bin/ls", "-l", NULL };
    execve("/bin/ls", arg, NULL);
    return 0;
}