'cd' 和 'cd ~' 之间的区别

'cd' 和 'cd ~' 之间的区别

我想知道,如果光盘仅将我发送到我的主文件夹光盘~是一样的,为什么首先添加〜呢?

这是 BASH 特有的东西还是它们在另一个 Shell 中的行为会有所不同?

答案1

~用途不仅仅如此。任何命令都可以从主文件夹的快捷方式中受益。因此,如果您想将 cd 放入您的家中,则没有必要,但是呢~/.config

$ cd ~/.config

否则,您必须写出主路径、使用 var$HOME或执行两个cds。也可用于复制或移动文件:

$ 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.然而,虽然cdwill 只做一件事,但波浪号可用于执行其他扩展,例如~+当前工作目录。

然而,有趣的是我们可以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已在这个问题:曾几何时,波浪号字符与HOMELear-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

然而,如果我们想通过环境变量来做到这一点,我们需要PWDHOME保持不变,或者如果你做类似的事情echo $HOME+- 这只是字符串/变量串联。但同样,~+从环境变量中获取信息:

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

笔记~+~-扩展在 中有效ksh,但在 中无效dash


回答您的一些具体问题:

这是 BASH 特有的东西还是它们在另一个 Shell 中的行为会有所不同?

不,这应该是一致的行为。kshdash、 和- 都与orcsh表现相同。cdcd ~

那么为什么首先添加 ~ 呢?

我想说的是方便和历史原因,如有关波浪号的链接答案中所解释的那样。最终,它的功能不仅仅是主目录扩展。

答案3

无论您是在上面还是下面几个文件夹级别$HOME,命令cdcd ~都会执行相同的操作并且不会有所不同 - 它会将您带回您的主目录。

但是:当您位于 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 相同,但打字较少。两个命令的作用相同,将工作目录更改为该位置。

相关内容