为什么 chdir( "~/dev/" ) 返回 -1?
Why chdir("~/dev/") returns -1?
在我的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的快捷方式。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 开发人员在Dev C 中编译代码时,我会收到此错误:[错误] ID返回1退出状态
- 在具有 64 位 CPU 的 32 位 Win8 上运行 32 位 Orwell Dev-C++ - 输入指针返回不正确
- C++新运算符返回新的意外-Dev cpp
- 为什么 chdir( "~/dev/" ) 返回 -1?