为什么chdir(“〜/ dev /”)返回-1?

时间:2011-04-06 15:33:12

标签: c++ c unix

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

6 个答案:

答案 0 :(得分:4)

将波形符(〜)扩展为HOME环境变量由bash完成。扩展在传递给chdir命令之前完成。底线是〜由bash处理,而不是由chdir命令处理。所以你不能在chdir()函数调用中使用它。

为了找到bash完成的其他类型的扩展(以及〜扩展的细节),请检查this link

答案 1 :(得分:2)

您可以使用以下内容检索~可能扩展到的内容(使用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;
}

答案 2 :(得分:1)

~的分辨率与任何环境变量一样属于shell。我不认为你可以在C api函数中使用它。

答案 3 :(得分:1)

在shell调用任何程序调用之前,你通常用shell替换你的home目录(即使cd不是程序调用但是在shell本身实现)。

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

答案 4 :(得分:1)

如前面的答案所述,C库不会替换〜。它是由shell完成的。您不应该假设用户主目录是/ home / myusername,因为这不能被假设。

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

答案 5 :(得分:0)

尝试使用$ HOME,〜只是$ HOME的快捷方式。