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