〜是$ HOME,但是有时吗?


14

光盘〜

做与

cd $HOME

这也和

cd /home/tandu

然而,

cd ~not-tandu

更改为 /home/not-tandu

这纯粹是句法选择吗?如果忽略了其他所有内容,内核(或cd可执行文件)如何处理呢?是否有特殊情况~来添加斜杠?也就是说,~/~切换到同一目录,但是~a是一个目录。对于您要更改到的任何其他目录,不能说相同的意思。


3
随意比较〜not-tandu和〜/ not-tandu,一个指向用户not-tandu主目录,另一个指向用户homedir中的not-tandu目录。
2012年

4
它不是内核或“ cd可执行文件”(因为没有这样的东西)-它是内置的shell。
保罗·汤布林

由于您没有提及它:cd没有任何参数的工作方式类似于cd ~。如果替换cdecho,则可以看到shell扩展了表达式。
jofel 2012年

Answers:


18

~$HOME许多外壳程序提供的别名,但$HOME更通用。 $HOME实际上要求外壳程序在此处插入(替代)环境变量HOME。有很多可以替代的不同环境变量,请尝试运行env以获取列表。请注意,~当不是单词开头时,并不总是可以识别出来。尝试使用以下两个命令进行比较:

ls /~
ls /$HOME

第一个传递给ls可执行文件/~,然后该文件尝试查看在~根目录中调用的文件,第二个扩展$HOME并变为//home/user,然后将其作为命令行参数传递给ls可执行文件。所有的POSIX系统(POSIX是UNIX和Linux系统如何操作的标准)都允许将多个斜杠视为一个斜杠,因此//home/user与上述说法相同/home/user~username是告诉外壳程序在passwd文件中查找用户名并返回其主目录的快捷方式。没有等效的环境变量。所有这些替换操作都是由外壳程序完成的,并且大多数情况下都受其支持,但是只有类似的环境变量$HOME才能被所有外壳程序所支持。也,cd实际上是一个内置命令。这是一个特殊的指令,告诉外壳程序本身更改目录。它不同于其他可以作为单独的可执行文件实现的Shell内置程序echo,因为它用于更改Shell进程的基本属性。 echo出于性能原因,它只是内置的shell,但在UNIX的美好时光中,仅作为其自己的可执行文件才可用/bin/echo


re“然后尝试在根目录中查看名为〜的文件”;那是所有unix口味的吗?
Pacerier,

17

~foo 表示“用户foo的主目录”。

这不是由内核完成的,而是由外壳程序解释的。只要外壳程序将其~foo视为参数,它就会透明地将其替换为用户的主目录,foo并将其传递给它。因此,当您运行时cd ~tandu,外壳实际上正在运行cd /home/tandu


1
具体用什么算法进行替换?是cd贝壳吗?如果您没有运行外壳怎么办?这是一个简单的“如果〜后跟某些内容,以不同的方式扩展吗?”吗?还是针对这种特殊情况进行其他特殊处理?
爆炸药2012年

8
请参阅有关Tilde扩展Bash手册。(许多其他shell和程序也遵循类似的规则。)
cjm 2012年

4
@tandu:shell可以cd,没有外部可执行文件可以执行(不可能)
Mat Mat

1
@tandu:如果您没有运行shell(例如,使用尝试此操作exec(2)),则不会进行shell扩展。没有shell扩展,~就不会被任何东西取代-这只是另一个完全有效的字符。这在我早期的SunOS时代给我带来了痛苦,因为/bin/sh并没有发愁~
Alexios'3

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.