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


10

我想知道,如果单独使用cd将我发送到我的主文件夹中,而cd〜也是一样,为什么〜才被添加呢?

它是BASH特有的,还是它们在另一个Shell中的行为不同?


2
绝对不是重复的。这个问题是问关于cd ~VS cd $HOMEVS cd ~not-tandu。这个问题是关于cdvs的问题cd ~

Answers:


17

~可用于远远不止这些。通过使用主目录的快捷方式,任何命令都可以受益。因此,如果您想进入自己的房屋,则没有必要,但是呢~/.config

$ cd ~/.config

否则,您将不得不写出原始路径,使用$HOMEvar或执行两个cds。也用于复制或移动文件:

$ cp ~/downloads/some-file some/path/

由于您的大多数文件都在家里,所以拥有快捷方式总是很好。


您好ahilsend,实际上我的问题更偏向于为什么这两种方式。我已经知道〜使用$ HOME变量了,但是,记住这一点,为什么仅“ CD”也会把我送回家。为什么两种方法具有相同的目的?
Luis Alvarado 2013年

4
@CYREX我的猜测是在想移到主目录的非常常见的情况下保存键入内容。
CVn

1
的另一种用途~cd ~user/download转到用户的下载目录。
ott

5

这样做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中的行为不同?

不,这应该是一致的行为。kshdashcsh-与cd或的行为相同cd ~

为什么要首先添加〜?

我要说的是方便和历史原因,如关于波浪号的链接答案中所述。最终,它不仅执行主目录扩展,而且执行的功能也更多。


0

无论您是位于上方还是下方的几个文件夹级别$HOME,命令cdcd ~都将执行相同的操作且不会有所不同-它将使您返回到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

0

〜代表/ home / username的位置,因此您节省了键入时间。例如,cd / home / username / Downloads与cd〜/ Downloads相同,但是键入较少。这两个命令执行相同的操作,将工作目录更改为该位置。


并不是的。例如root,主目录通常位于外部/home
Dmitry Grigoryev
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.