我想知道,如果光盘仅将我发送到我的主文件夹光盘~是一样的,为什么首先添加〜呢?
这是 BASH 特有的东西还是它们在另一个 Shell 中的行为会有所不同?
答案1
其~
用途不仅仅如此。任何命令都可以从主文件夹的快捷方式中受益。因此,如果您想将 cd 放入您的家中,则没有必要,但是呢~/.config
?
$ cd ~/.config
否则,您必须写出主路径、使用 var$HOME
或执行两个cd
s。也可用于复制或移动文件:
$ cp ~/downloads/some-file some/path/
由于您的大部分文件都在家里,因此有一个快捷方式总是好的。
答案2
所做的cd
基本上是cd
不带参数的调用,并根据cd
行为“...如果未提供 dir,则 HOME shell 变量的值是默认值。” (从bash手册)。相比之下,cd ~
当你向命令提供参数时, shell 就会cd
执行~
波形符扩展。至于返回用户的主目录 - 没有区别。无论哪种情况,HOME
都会查询环境变量:
$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'
/usr
/usr
实际上,这与cd $HOME
.然而,虽然cd
will 只做一件事,但波浪号可用于执行其他扩展,例如~+
当前工作目录。
然而,有趣的是我们可以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 的用户的主目录。否则,波形符前缀将替换为与指定登录名关联的主目录。
请注意,取消设置与设置空变量不同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
行为。
波形符和$HOME
有一些不同和不同的存在理由。$HOME
是一个 shell 变量,它也恰好是环境变量之一 - 并且可用于所有程序;在 C 中你可以用来environ()
访问它。相比之下,tilde
是执行波浪线扩展的特定于 shell 的语法,尽管您可以使用wordexp()
函数来执行类似 shell 的扩展(参考)在 C 中也是如此。
~
代表的原因HOME
已在这个问题:曾几何时,波浪号字符与HOME
Lear-Siegler ADM-3A 终端上共享相同的密钥。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
,以及 .相比之下,我们不能做这样的事情来使用波形符:
$ 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
、 和- 都与orcsh
表现相同。cd
cd ~
那么为什么首先添加 ~ 呢?
我想说的是方便和历史原因,如有关波浪号的链接答案中所解释的那样。最终,它的功能不仅仅是主目录扩展。
答案3
无论您是在上面还是下面几个文件夹级别$HOME
,命令cd
和cd ~
都会执行相同的操作并且不会有所不同 - 它会将您带回您的主目录。
但是:当您位于 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
答案4
~ 代表 /home/用户名位置,因此您可以在键入时节省一些时间。例如 cd /home/username/Downloads 与 cd ~/Downloads 相同,但打字较少。两个命令的作用相同,将工作目录更改为该位置。