Answers:
该~可用于远远不止这些。通过使用主目录的快捷方式,任何命令都可以受益。因此,如果您想进入自己的房屋,则没有必要,但是呢~/.config?
$ cd ~/.config
否则,您将不得不写出原始路径,使用$HOMEvar或执行两个cds。也用于复制或移动文件:
$ cp ~/downloads/some-file some/path/
由于您的大多数文件都在家里,所以拥有快捷方式总是很好。
~是cd ~user/download转到用户的下载目录。
这样做cd 基本上是cd在不带参数的情况下进行的,并且根据cd行为“ ...如果未提供dir,则HOME shell变量的值为默认值。” (来自bash手册)。相比之下,cd ~当您向cdcommand 提供参数时,恰好是~,shell将执行代字扩展。至于回到用户的主目录,没有区别。无论哪种情况,HOME都会查询环境变量:
$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'
/usr
/usr
实际上,这与没什么区别cd $HOME。但是,虽然cd只会做一件事,但波浪号可以用于执行其他扩展,例如~+当前工作目录。
但是,有趣的是我们可以unset HOME打破cd但~仍然可以工作:
$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'
bash: line 0: cd: HOME not set
/usr
/home/xieerqi
为什么呢 同样,在手册中回答:
如果未设置HOME,则将替换执行Shell的用户的主目录。否则,将tilde-prefix替换为与指定登录名关联的主目录。
请注意,取消设置与使空变量HOME=生效并不相同。文档专门讨论了未设置变量。使变量等于空字符串的作用与我们期望的相反:
bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr
在这里,您可以看到制作HOME空字符串会破坏波浪号和cd行为。
蒂尔德(Tilde)和$HOME存在存在一些差异和不同的原因。$HOME是一个shell变量,它碰巧也是环境变量之一-可供所有程序使用;在C中,您将使用它environ()来访问它。相比之下,tilde是特定于Shell的语法,它们执行波浪号扩展,尽管您也可以使用wordexp()函数在C中执行类似于Shell的扩展(引用)。
在这个问题中回答了~代表原因的原因:曾经有波浪号字符与Lear-Siegler ADM-3A终端共享同一密钥。相比之下,环境变量具有纯粹的符号含义,没有物理表示。HOMEHOMEHOME
此外,HOME环境变量这一事实使我们可以取消设置它,因为我们无法~通过简单的方法将其设置为其他值。
# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'
/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'
/home/xieerqi
请注意空白行,该行首先echo输出unset变量,以及的事实。相比之下,我们无法做这样的事情来波浪化:
$ bash -c '~=; cd ~;pwd'
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi
但是,更改HOME确实会影响~:
$ env 'HOME=' bash -c 'echo $HOME; stat ~;'
stat: cannot stat '': No such file or directory
另外,由于~还可以用作扩展字符,因此我们可以执行以下操作以显示当前工作目录:
$ bash -c 'cd /etc/;stat -c "%n" ~+'
/etc
而如果我们想通过环境变量来做到这一点,我们需要PWD,并且HOME保持不变,或者如果您做类似的事情echo $HOME+-那仅仅是字符串/变量串联。但是同样,~+从环境变量中提取信息:
$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'
/usr
注意:~+和~-扩展可在中使用ksh,但不能在中使用dash。
要回答您的一些特定问题:
它是BASH特有的,还是它们在另一个Shell中的行为不同?
不,这应该是一致的行为。ksh,dash和csh-与cd或的行为相同cd ~。
为什么要首先添加〜?
我要说的是方便和历史原因,如关于波浪号的链接答案中所述。最终,它不仅执行主目录扩展,而且执行的功能也更多。
无论您是位于上方还是下方的几个文件夹级别$HOME,命令cd和cd ~都将执行相同的操作且不会有所不同-它将使您返回到HOME目录。
但是,当您位于HOME上方1个或多个文件夹级别并且想要直接转到1个目录或多个文件夹级别的子目录时$HOME,波浪号(~)可用于保存击键操作,用于替换需要引用的文本到$HOME键入时cd命令。例如;
/$ cd # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3 # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3
〜代表/ home / username的位置,因此您节省了键入时间。例如,cd / home / username / Downloads与cd〜/ Downloads相同,但是键入较少。这两个命令执行相同的操作,将工作目录更改为该位置。
root,主目录通常位于外部/home
cd ~VScd $HOMEVScd ~not-tandu。这个问题是关于cdvs的问题cd ~。