在 Linux 上,这相当愚蠢,我正试图弄清楚如何使用命令行进行导航。我可以用这个轻松地在我的主文件夹和里面的文件夹中来回移动:
cd ~/Documents/
但是当我打开文档中的文件夹时,出现如下错误:
chance@asus:~/Documents$ cd ~/xmr-stak-cpu-1.3.0-1.5.0
bash: cd: /home/chance/xmr-stak-cpu-1.3.0-1.5.0: No such file or directory
我很困惑,因为我需要使用“~”才能进入文档,但在文档中我无法导航到后续文件夹。
答案1
总结
- 路径从左到右读取,最左边的目录指定为您正在遍历的目录树的顶部
~/
路径中的前导表示您的主文件夹- 主导
./
手段在此文件夹中或者当前工作目录中的内容 - 可以通过提供相对于当前工作目录的路径或指定完整路径来导航到目录
~
仅与命令行相关,与 GUI 无关(如评论)。
答案经过编辑,包括了波浪号扩展的更正式解释,以适应问题的新编辑标题,因此请阅读下面更正式的解释。前两部分或多或少是对 OP 做了什么和没做什么的温和解释。
问题
路径中的前导~
(波浪号)后跟斜线被理解为对用户主目录的引用,即~/Documents
始终表示/home/chance/Documents
。(有例外和特殊情况,但为了解释基础知识,我们到目前为止保持简单;请参阅下面的更深入的解释)。
所以当你这么做的时候cd ~/xmr-stak-cpu-1.3.0-1.5.0
,你是在说带我到xmr-stak-cpu-1.3.0-1.5.0
位于我的主文件夹中的目录。同样值得注意的是,路径总是从左到右读取,以斜线分隔,最左边是您引用的目录树的顶部。因此,如果您想从主页进入文档,再进入文件夹,则所有部分都必须存在于路径中,并以斜线分隔,而您想要进入的文件夹当然必须是最右边的。
仔细查看错误信息:
bash: cd: **/home/chance/xmr-stak-cpu-1.3.0-1.5.0**: No such file or directory
shell 正确扩展~
为并将/home/chance
它与您提供的内容合并。当然,由于您指定的目录不存在,因此您会收到相应的错误消息。
你应该做什么
你可以用以下两种方式之一来做 - 给出完整路径或~/Documents
先跳转到,然后跳转到你想要的目录。当你cd ~/Documents
想导航到位于当前目录内的文件夹,您可以使用./
符号。因此,您可以这样做:
$ cd ~/Documents
$ cd ./xmr-stak-cpu-1.3.0-1.5.0/
当然,您不必添加./
,只需添加 ,它cd xmr-stak-cpu-1.3.0-1.5.0
就会自动查找您当前的工作目录。但是,最好是明确说明,此外还./
有助于避免以 开头的文件名出现问题-
(这是完全不同的问题,是另一天的话题)。
或者,您可以提供完整路径:
$ cd ~/Documents/xmr-stak-cpu-1.3.0-1.5.0/
请注意,您也可以使用$HOME
变量代替~
,效果几乎相同,但它们的性质以及您可以使用的额外功能有所不同~
。请参阅我的回答cd和cd的区别~。
更正式、更深入的解释
好吧,到目前为止,我们为了向新用户解释基础知识,把事情保持得相当简单。但波浪号、点斜线和目录树导航远不止这些。当我们考虑到波浪号cd
在其他 shell 中的行为不同,并且我们还考虑到POSIX 标准. 我已经在我的Unix & Linux 相关答案,因此请务必检查一下。
在类似 Bourne 的 shell 中(即bash
,与 相关的实现,如ksh
,以及 Ubuntu 的默认,实际上是),不带引号的前导波浪号表示ksh
mksh
/bin/sh
dash
波浪号扩展,这实际上是 POSIX 指定为标准行为。根据未加引号的前导波浪号后面的内容,它会产生不同的效果:
以未加引号的 开头
~
,当其后没有字符时(或者 和 之间没有任何内容~
,/
即空字符串),它将扩展为与$HOME
环境变量相同的值,即您的主文件夹。因此cd ~
和cd ~/
表示将目录更改为您的主文件夹。请注意~
和/
不应加引号:$ bash -c 'cd /etc/; ls -d ~' /home/xieerqi $ bash -c 'cd /etc/; ls -d ~/' /home/xieerqi/ $ bash -c 'cd /etc/; ls -d ~"/"' ls: cannot access '~/': No such file or directory $ bash -c 'cd /etc/; ls -d "~"/' ls: cannot access '~/': No such file or directory
以不带引号的前导 开始
~
,其后的字符集合将被视为可能的登录名。因此cd ~testuser
或cd ~testuser/
表示您要跳转到 的testuser
当前工作目录。同样,引用很重要:$ bash -c 'cd /etc/; ls -d ~testuser' /home/testuser $ bash -c 'cd /etc/; ls -d ~"testuser"' ls: cannot access '~testuser': No such file or directory $ bash -c 'cd /etc/; ls -d ~testuser"/"' ls: cannot access '~testuser/': No such file or directory
这些都是标准行为,在 、 和 中都适用dash
。ksh
但是bash
,shell 有一些不同之处。特别bash
是,额外扩展您可以使用波浪号执行此操作,并且处理取消设置的HOME
方式与其他 shell 不同。以下是您可以在中执行的额外扩展bash
:
~+
引用您当前的工作目录,与变量相同PWD
。这也适用于ksh
但不适用于dash
。$ bash -c 'echo ~+; unset PWD;echo ~+' /home/xieerqi ~+
~-
引用您以前的工作目录,与变量相同OLDPWD
。也可以在 中使用,ksh
但不能dash
。$ bash -c 'cd /etc/;cd /usr; echo ~-; unset OLDPWD;echo ~-' /etc ~-
在 中,
bash
您可以通过将特定目录推送到目录堆栈(或数组)来导航和记录您去过的位置,并且可以通过 引用它们~[+-]<NUMBER>
,其中+
表示从数组的左侧查找,然后-
从右侧查找。这是特定的,在和bash
中都不起作用。ksh
dash
$ bash -c 'pushd /etc/; pushd /usr; echo ~+1' /etc ~ /usr /etc ~ /etc
参见图表muru 的回答相关问题,展示了如何使用
~+
和的索引~-
。
我已经暗示过的另一件事是取消设置HOME
环境变量。它是一个变量并且可以取消设置,这带来了一个问题——根据 POSIX 标准的规定,波浪号扩展取决于环境变量,但按照标准“[我]家未设置,结果未指定。”在这种情况下,ksh
只需dash
中断:
$ ksh -c 'cd /usr; unset HOME; cd ~'
ksh: cd: xieerqi: [No such file or directory]
$ dash -c 'cd /usr; unset HOME; cd ~'
dash: 1: cd: can't cd to ~
事实上,这是符合标准cd
以及:
- 如果没有给出目录操作数并且 HOME 环境变量为空或未定义,则默认行为由实现定义,不应采取进一步步骤。
相比之下bash
,处理事情的方式不同。根据bash 手册:
如果 HOME 未设置,则将替换为执行 shell 的用户的主目录。否则,波浪号前缀将替换为与指定登录名关联的主目录。
换句话说,当家仅未设置,bash 不会中断,但如果HOME
设置为空字符串,它就会中断:
$ bash -c 'cd /etc; unset HOME; cd ~; pwd'
/home/xieerqi
$ bash -c 'cd /etc; HOME=""; cd ~; pwd'
/etc
有趣的事实
~
被选为代表用户的主目录,因为曾经有一段时间~
,并且HOME
键曾经位于 Lier-Siegler ADM-3A 终端上的同一个键盘键上。(来源)
也可以看看:
答案2
波浪符号 ( ~
) 是您的主目录(类似环境变量$HOME
)的缩写。您可以echo ~
自己运行查看。在您的例子中,您将看到/home/chance
。
这绝对路径您要访问的目录之一是,~/Documents/xmr-stak-cpu-1.3.0-1.5.0
因此如果您愿意,您可以cd
直接到那里,无论您身在何处,这都可以工作:
cd ~/Documents/xmr-stak-cpu-1.3.0-1.5.0
如果你已经登录~/Documents
,你可以使用相对路径1:
cd xmr-stak-cpu-1.3.0-1.5.0
或者,更详细地说,您可以使用./
来引用当前目录:
cd ./xmr-stak-cpu-1.3.0-1.5.0
另请注意,如果您当前位于~
,则有一个不同的相对路径:
cd Documents/xmr-stak-cpu-1.3.0-1.5.0
脚注:
从维基百科、绝对路径与相对路径:
一个绝对或者满的路径指向文件系统中的同一位置,与当前工作目录无关。为此,它必须包含根目录。
相比之下,相对的路径从某个给定的工作目录开始,避免需要提供完整的绝对路径。