~ 是 $HOME,但有时呢?

~ 是 $HOME,但有时呢?

光盘~

做同样的事情

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

~后跟的用户名扩展到该用户的主目录。

相关内容