为什么 chdir( "~/dev/" ) 返回 -1?

Why chdir("~/dev/") returns -1?

本文关键字:返回 dev chdir 为什么      更新时间:2023-10-16

在我的c ++应用程序中,我想将工作目录更改为指定的目录。但是当我"~/dev/"指定为工作目录时chdir()失败并返回 -1。相反,当我指定"/home/myusername/dev"时,它可以工作。为什么会这样?如何解决此问题(除了检查字符串第一个字符是否~并将其替换为/home/myusername)?

波浪号 (~) 到 HOME 环境变量的扩展是通过 bash 完成的。该扩展是在传递给 chdir 命令之前完成的。底线是 ~ 由 bash 处理,而不是由 chdir 命令处理。所以你不能在 chdir() 函数调用中使用它。

为了找到bash完成的其他类型的扩展(以及~扩展的详细信息),请检查此链接。

您可以使用

以下内容来检索~可能扩展到的内容(使用 getpwuid):

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <pwd.h>
// @prefer_env should be TRUE if you prefer the value of the $HOME
//  environment variable over what is stored in the user's passwd
char* get_homedir(int prefer_env)
{
    char *found = getenv("HOME");
    char *homedir = NULL;
    if (!prefer_env || !found)
    {
        struct passwd *pw = getpwuid(geteuid());
        if (pw && pw->pw_dir) found = pw->pw_dir;
    }
    if (found)
    {
        // I would add error checking
        homedir = (char*)malloc(strlen(found) + 1);
        strcpy(homedir, found);
    }
    return homedir;
}

像任何环境变量一样,~的分辨率都落在 shell 上。我认为你不能在 C api 函数中使用它。

当你在 shell 调用任何程序调用

之前键入它时,~ 通常会被你的 shell 主目录替换(即使 cd 不是程序调用,而是在 shell 本身中实现)。

无论如何:在 C 中没有办法自动替换 ~ 由你的 homedir

如前面的答案所述,C 库不会为您替换 ~。它是由外壳完成的。您不应假定用户主目录是/home/myusername,因为不能假设这一点。

确定主目录的正确方法是检查 HOME 环境变量,并读取其内容。它通常会被定义,但如果不是,你应该回退到使用 getpwuid() 或类似的调用来获取当前用户的密码条目,其中包括他们的主目录。

尝试改用$HOME,~ 只是$HOME的快捷方式。