bash 中的特殊字符

bash 中的特殊字符

.(或 ..) 和~字符在 bash 如何处理方面有什么区别?如果我使用~字符,bash会将其扩展为绝对路径,但如果使用.(或..)bash不会将其扩展为绝对路径?

我的 pwd 是主目录。现在,当我运行命令:(ls '.'或 ls 。)时,它会显示 pwd 的内容,但如果我运行命令:ls '~',它会给出文件或目录不存在的错误。这意味着~在将其传递给命令之前由 shell 扩展,ls.事实并非如此。是不是.特殊字符? (或 ..)何时被.shell 视为特殊字符并扩展?

答案1

.不是 shell 中的特殊字符。.和目录链接的所有属性..都与文件系统结构有关,shell 与之无关。请注意,即使在那里,它也不是角色,而是那两个特定的名字。foo.txt.bar...是常规文件名,即使以点开头的文件名被 glob 和 特殊处理ls

另一方面,~是文件系统的常规字符,但在 shell 中波形符扩展对其进行特殊对待。因此,~单词开头不带引号的内容会扩展到当前用户的主目录,并~foo扩展到 user 的主目录foo

(当然,shell 确实知道 和.是什么..,因为运行cd ..from/tmp不会使当前工作目录显示为/tmp/..,而是显示为/。此外,与字母 and 不同_,点在变量名称中无效,例如 eg,和不是。)%-

答案2

~作为独立的(即不加引号的)由 shell 解释为主目录。当您引用它时,解释就会停止,因此它与普通变量不同。

...是文件系统中的引用。

因此,如果您尝试在 C 程序中使用.(因此没有 shell),那么它会起作用,如下所示:

#include <stdio.h>

int main(void) {
  DIR *d;
  struct dirent *dir;
  d = opendir(".");  /*<---------------See the . for current dir */
  if (d) {
    while ((dir = readdir(d)) != NULL) {
      printf("%s\n", dir->d_name);
    }
    closedir(d);
  }
  return(0);
}

而如果你尝试用~, ( d = opendir("~");) 来实现,那是行不通的。

相关内容