【问题标题】:Why mkdir fails to work with tilde (~)?为什么 mkdir 无法使用波浪号 (~)?
【发布时间】:2011-04-06 16:57:22
【问题描述】:

当我写作时

mkdir("~/folder1" , 0777);

在 linux 中,创建目录失败。如果我将 ~ 替换为扩展的主目录,它可以正常工作。使用~有什么问题?

谢谢

【问题讨论】:

    标签: c++ c linux shell mkdir


    【解决方案1】:

    ~ 只有 shell 知道,mkdir 系统调用不知道。

    但如果你尝试:

    system("mkdir ~/foo");
    

    这是因为 "mkdir ~/foo" 被传递给 shell,shell 将 ~ 扩展为 $HOME

    如果你想使用$HOMEmkdir,你可以使用getenv函数:

    char path[MAX];
    char *home = getenv ("HOME");
    if (home != NULL) {
            snprintf(path, sizeof(path), "%s/new_dir", home);
            // now use path in mkdir
            mkdir(path, PERM);
    }
    

    【讨论】:

    • -1 用于给出具有巨大缓冲区溢出问题的示例代码。您应该编辑它以使用 snprintf 或在调用 sprintf 之前检查 home 的长度。
    • @R..GitHubSTOPHELPINGICE 或者你可能是一个知道主目录可能的最大长度的程序员并且你知道MAX 至少是那个大小或更大。这些功能确实适用于不知道自己在做什么的人。这就是为什么在过去人们知道如何编程时它们不存在的原因。
    • @Deanie:环境变量 HOME 的值没有最大长度,即使有效路径名有最大长度。写出来的代码容易出现缓冲区溢出,这样写错代码与“知道如何编程”完全相反。
    【解决方案2】:

    ~ 是一个 shell 元字符,而不是内核提供的“快捷方式”。

    如果您想轻松支持~,请参阅wordexp(3)glob(3) 手册页。 (他们可能做的比你想要的多。)

    【讨论】:

    • (感谢 o11c 提供了 glob(3) 条目;它没有 ~ 但仍然有用。)
    • 是的,请参阅该页面中的GLOB_TILDE(和GLOB_TILDE_CHECK)。
    【解决方案3】:

    ~ 通常由 shell 扩展。不使用 shell 意味着你负责扩展它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-20
      • 2014-01-19
      • 2013-07-21
      • 2019-11-18
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      相关资源
      最近更新 更多