.
(或 ..) 和~
字符在 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("~");
) 来实现,那是行不通的。