【问题标题】:Is there a way for bash to know home directory without $HOME variablebash 有没有办法在没有 $HOME 变量的情况下知道主目录
【发布时间】:2021-04-01 03:58:02
【问题描述】:

我发现 bash,即使我取消设置 HOME、USER、LOGNAME 环境变量并写入cd ~,仍然知道 HOME 目录的路径。这是怎么发生的?

【问题讨论】:

  • ~ 解释得很好here
  • 这取决于操作系统,但(例如)~ 解析为 $HOME 或 getent passwd <user> 将从 /etc/passwd 获取主目录

标签: c shell environment-variables


【解决方案1】:

C 代码可以调用 getpwnaw、getpwuid、getpwent 等函数来获取有关用户的信息。

来自 Bash 的源代码,在 lib/tilde/shell.c,见第 69 行:

 59 char *
 60 get_home_dir (void)
 61 {
 62   static char *home_dir = (char *)NULL;
 63   struct passwd *entry;
 64
 65   if (home_dir)
 66     return (home_dir);
 67
 68 #if defined (HAVE_GETPWUID)
 69   entry = getpwuid (getuid ());
 70   if (entry)
 71     home_dir = savestring (entry->pw_dir);
 72 #endif
 73
 74 #if defined (HAVE_GETPWENT)
 75   endpwent ();          /* some systems need this */
 76 #endif
 77
 78   return (home_dir);
 79 }

在lib/tilde/tilde.c,见第386行:

335 char *
336 tilde_expand_word (const char *filename)
337 {
338   char *dirname, *expansion, *username;
339   int user_len;
340   struct passwd *user_entry;
...
384   dirname = (char *)NULL;
385 #if defined (HAVE_GETPWNAM)
386   user_entry = getpwnam (username);
387 #else
388   user_entry = 0;
389 #endif
...

【讨论】:

  • user_entry = 0;?这就是为什么NULL 指针和“空指针常量”在 C 语言中变得如此复杂的原因。过于聪明并且错误地认为“NULL 只是零的程序员”所以我将使用0 而不是正确的NULL。”没关系,C 中不需要来自 NULL 的 (char *) 演员表。
  • @AndrewHenle:'错误地认为“NULL 只是零,所以我将使用 0 而不是正确的 NULL。”' 自从 C( 99?)
  • @alk C99 创建“空指针常量”概念的全部原因是错误代码假定NULL 为零。 sop 对标准低的可怜程序员来说是一个问题,现在我们不得不忍受 NULL 和“空指针常量”的复杂性。
  • @AndrewHenle NULL 指针需要比较等于零常量。
  • @iBug 你错过了我的意思。 NULL 指针需要比较等于零常数标准经过修改,变得比原来要复杂得多。这与假设“指针是int”的无能程序员没有什么不同,这是bash 源代码意味着将指针设置为文字零的可能性很高,早于C99 并导致了不必要的复杂性。 NULL 的 (char *) 演员也很糟糕。
猜你喜欢
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 2016-12-27
  • 2021-04-23
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多