光盘~
做同样的事情
cd $HOME
这也与
cd /home/tandu
然而,
cd ~not-tandu
更改为/home/not-tandu
这纯粹是语法选择吗?内核(或cd
可执行文件)如何处理这个问题?如果省略其他所有内容,是否有特殊情况需要~
添加斜杠?也就是说,~/
和~
换到同一个目录下,只不过~a
是上一个目录。对于您更改到的任何其他目录来说,情况并非如此。
答案1
~
$HOME
是许多 shell 提供的别名,但$HOME
更通用。 $HOME
实际上要求 shell 在此处插入(替换)环境变量 HOME。有很多不同的环境变量可以替换,尝试运行env
一个列表。请注意,~
当它不在单词开头时,并不总是能被识别。尝试这两个命令进行比较:
ls /~
ls /$HOME
第一个被传递给 ls 可执行文件,/~
然后尝试查看~
根目录中调用的文件,第二个扩展$HOME
并成为//home/user
,然后作为命令行参数传递给 ls 可执行文件。所有 POSIX 系统(POSIX 是 UNIX 和 Linux 系统操作方式的标准)都允许将多个斜杠视为与一个斜杠相同,因此//home/user
与以下内容相同/home/user
。 ~username
是告诉 shell 在 passwd 文件中查找用户名并返回其主目录的快捷方式。没有等效的环境变量。所有这些替换都是由 shell 完成的,并且大多数 shell 都支持,但只有像这样的环境变量$HOME
才能保证所有 shell 都支持。另外,cd
实际上是一个内置命令。这是一个特殊的指令,告诉 shell 本身更改目录。它不像其他 shell 内置程序那样可以作为单独的可执行文件实现echo
,因为它用于更改 shell 进程的基本属性。 echo
只是出于性能原因而内置的 shell,但在 UNIX 的美好时光中,只能作为其自己的可执行文件使用/bin/echo
。
答案2
~foo
表示“用户 foo 的主目录”。
这不是由内核完成的,而是由 shell 解释的。每当 shell 看到~foo
参数时,它都会透明地将其替换为用户的主目录foo
,并将其传递到其位置。因此,当您运行时cd ~tandu
,shell 实际上正在运行cd /home/tandu
。
答案3
~
后跟的用户名扩展到该用户的主目录。