谈到 linux 时非常愚蠢,我正在尝试使用命令行找出导航。我可以很容易地从我的主文件夹和里面的文件夹来回移动:
cd ~/Documents/
Run Code Online (Sandbox Code Playgroud)
但是当我打开文档中的文件夹时,出现如下错误:
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
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为我需要使用“~”进入文档,但在文档中我无法导航到后续文件夹。
Ser*_*nyy 17
~/ 路径是指你的主文件夹./意味着在此文件夹或当前工作目录中的东西~仅与命令行相关,与 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位于我的主文件夹中的目录。还有一点需要注意,路径总是从左到右读取,用斜杠分隔,最左边是您引用的目录树的顶部。所以如果你想从 home 到 Documents 再到你的文件夹,所有的部分都必须存在于路径中,用斜杠分隔,当然,你想要进入的文件夹必须是最正确的。
仔细查看错误信息:
bash: cd: **/home/chance/xmr-stak-cpu-1.3.0-1.5.0**: No such file or directory
Run Code Online (Sandbox Code Playgroud)
外壳正确地扩展~为/home/chance并加入了你给它的东西。当然,因为您指定的目录不存在,您会收到相应的错误消息。
您可以通过以下两种方式之一进行操作 - 提供完整路径或先跳转~/Documents,然后跳转到您想要的目录。当您cd ~/Documents想要导航到位于您所在的当前目录内的文件夹时,您可以使用./符号。所以你会这样做:
$ cd ~/Documents
$ cd ./xmr-stak-cpu-1.3.0-1.5.0/
Run Code Online (Sandbox Code Playgroud)
当然,您不必添加那个./,当您这样做时,它cd xmr-stak-cpu-1.3.0-1.5.0会自动查看您当前的工作目录。但是,最好是明确的,此外还./有助于避免可能以开头的文件名问题-(这是一个完全不同的问题,是另一天的主题)。
或者,您可以提供完整路径:
$ cd ~/Documents/xmr-stak-cpu-1.3.0-1.5.0/
Run Code Online (Sandbox Code Playgroud)
请注意,您也可以使用$HOME变量而不是~,这在效果上几乎相同,但是它们的性质和您可以使用的额外内容不同~。请参阅我对差异 cd 和 cd ~ 的回答。
好的,到目前为止,为了向新用户解释基础知识,我们已经使事情变得相当简单。但是,波浪号、点斜线和目录树导航远不止这些。当我们考虑波浪号并cd在其他 shell 中表现不同时,如果我们还考虑POSIX 标准,事情就会变得更加复杂。我在 Unix & Linux 上的相关答案中已经提到了这里的一些内容,所以一定要检查一下。
在类似Bourne外壳(即bash,ksh,ksh-相关的实现一样mksh,和Ubuntu的默认/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
Run Code Online (Sandbox Code Playgroud)使用不带引号的前导~,其后的字符集合被视为可能的登录名。所以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
Run Code Online (Sandbox Code Playgroud)这是所有标准行为,并且在dash、ksh、 和 中适用bash。但是,shell 有一些不同之处。特别是,bash具有您可以使用波浪号执行的额外扩展,并且处理 unset 的HOME方式与其他 shell 不同。以下是您可以进行的额外扩展bash:
~+引用您当前的工作目录,与PWD变量相同。这也适用于ksh但不适用于dash.
$ bash -c 'echo ~+; unset PWD;echo ~+'
/home/xieerqi
~+
Run Code Online (Sandbox Code Playgroud)~-引用您之前的工作目录,与OLDPWD变量相同。也适用于ksh但不适用dash。
$ bash -c 'cd /etc/;cd /usr; echo ~-; unset OLDPWD;echo ~-'
/etc
~-
Run Code Online (Sandbox Code Playgroud)在bash 你可以浏览和记录你去过的地方通过目录栈(或阵列)上推特定的目录,你可以通过引用它们~[+-]<NUMBER>,这里+将意味着从左边的数组,并期待-从右侧。这是bash具体的,在不工作的工作ksh也没有dash。
$ bash -c 'pushd /etc/; pushd /usr; echo ~+1'
/etc ~
/usr /etc ~
/etc
Run Code Online (Sandbox Code Playgroud)
我已经暗示过的另一件事是未设置的HOME环境变量。它是一个变量并且可以取消设置这一事实带来了一个问题 - 正如 POSIX 标准所指定的,波浪号扩展取决于环境变量,但根据标准“[i] HOME未设置,结果未指定”。在这种情况下,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 ~
Run Code Online (Sandbox Code Playgroud)
事实上,这也是符合标准的cd:
- 如果没有给出目录操作数并且 HOME 环境变量为空或未定义,则默认行为是实现定义的,不应采取进一步的步骤。
相比之下bash,处理事情的方式不同。根据bash 手册:
如果未设置 HOME,则会替换执行 shell 的用户的主目录。否则,波浪号前缀将替换为与指定登录名关联的主目录。
换句话说,当 home 未设置 only 时,bash 不会中断,但如果HOME设置为空字符串,它将中断:
$ bash -c 'cd /etc; unset HOME; cd ~; pwd'
/home/xieerqi
$ bash -c 'cd /etc; HOME=""; cd ~; pwd'
/etc
Run Code Online (Sandbox Code Playgroud)
~之所以选择代表用户的主目录,是因为曾几何时~,HOME键曾驻留在 Lier-Siegler ADM-3A 终端上的同一个键盘键上。(来源)
波浪号 ( ~) 是主目录的缩写(如环境变量$HOME)。你可以echo ~自己跑过去看看。在您的情况下,您会看到/home/chance.
您要访问的目录的绝对路径1是~/Documents/xmr-stak-cpu-1.3.0-1.5.0,因此,如果您愿意,可以cd直接访问,无论您身在何处,这都可以使用:
cd ~/Documents/xmr-stak-cpu-1.3.0-1.5.0
Run Code Online (Sandbox Code Playgroud)
如果您已经在~/Documents,则可以使用相对路径1:
cd xmr-stak-cpu-1.3.0-1.5.0
Run Code Online (Sandbox Code Playgroud)
或者,更详细地,您可以使用./来引用当前目录:
cd ./xmr-stak-cpu-1.3.0-1.5.0
Run Code Online (Sandbox Code Playgroud)
另请注意,如果您当前在~,则有不同的相对路径:
cd Documents/xmr-stak-cpu-1.3.0-1.5.0
Run Code Online (Sandbox Code Playgroud)
脚注:
来自维基百科,绝对路径与相对路径:
一个绝对或完整路径指向一个文件系统中的同一位置,而不考虑当前的工作目录。为此,它必须包含根目录。
相比之下,相对路径从某个给定的工作目录开始,无需提供完整的绝对路径。