Answers:
该~
可用于远远不止这些。通过使用主目录的快捷方式,任何命令都可以受益。因此,如果您想进入自己的房屋,则没有必要,但是呢~/.config
?
$ cd ~/.config
否则,您将不得不写出原始路径,使用$HOME
var或执行两个cd
s。也用于复制或移动文件:
$ cp ~/downloads/some-file some/path/
由于您的大多数文件都在家里,所以拥有快捷方式总是很好。
~
是cd ~user/download
转到用户的下载目录。
这样做cd
基本上是cd
在不带参数的情况下进行的,并且根据cd
行为“ ...如果未提供dir,则HOME shell变量的值为默认值。” (来自bash手册)。相比之下,cd ~
当您向cd
command 提供参数时,恰好是~
,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终端共享同一密钥。相比之下,环境变量具有纯粹的符号含义,没有物理表示。HOME
HOME
HOME
此外,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 $HOME
VScd ~not-tandu
。这个问题是关于cd
vs的问题cd ~
。