我有一个文件夹“abc”。我创建了一个符号链接:ln -s abc abclink
。但是当我输入时,cd abclink
它显示“没有这样的文件或目录”。
我可以看到链接,它具有“lrwxr-xr-x”权限,为什么它不起作用?如何让它正常工作?
答案1
通常,当您遇到这种情况时,您的目标无效。即 abc 不存在。是的,您可以创建指向不存在的事物的符号链接。
答案2
我有一个特别令人困惑的用例,它最终与接受的答案相同 - 目标目录不存在 - 但有一个额外的转折。
我正在创建一个指向环境变量中定义的目录的符号链接,我们将调用FOO
:
$ FOO="~/project"
$ ln -s foo "$FOO"
这似乎工作得很好:
$ ls -al
lrwxr-xr-x 1 jondoe jondoe 10 Feb 20 02:25 foo -> ~/project
但是,当我尝试进入该foo
文件夹时,出现错误:
$ cd foo
-bash: cd: foo: No such file or directory
这很奇怪,因为我们刚刚看到foo
肯定存在。此外,也存在~/project
:
$ cd ~/project
$ ls -al
drwxr-xr-x 3 jondoe jondoe 102 Feb 20 02:26 .
drwxr-xr-x 4 jondoe jondoe 136 Feb 20 02:25 ..
-rw-r--r-- 1 jondoe jondoe 0 Feb 20 02:26 README.md
符号链接和它指向的文件夹怎么可能都存在,但我实际上无法使用符号链接?
事实证明,原因是FOO
环境变量中有一个波浪符号~
。由于我在创建符号链接时将此变量括在引号中,波浪符号没有经过 bash 扩展,因此生成的符号链接指向文字路径,~/project
而不是project
我的主目录中的文件夹。
答案3
该问题的可能来源:如果目标目录包含空格,则不需要在按键插入的值周围加上引号Tab
,因为终端会使用反斜杠为您转义空格。
例如,假设有一个目录/tmp/Dir With Spaces/
:
ln -s /tmp/Dir\ With\ Spaces link1 <-- This works
ln -s "/tmp/Dir With Spaces" link2 <-- As does this
ln -s "/tmp/Dir\ With\ Spaces" link3 <-- But this one doesn't
通过查看输出你可以了解原因ls -l
:
lrwxr-xr-x 1 dave staff 21 Jul 19 10:30 link1 -> /tmp/Dir With Spaces/
lrwxr-xr-x 1 dave staff 21 Jul 19 10:31 link2 -> /tmp/Dir With Spaces/
lrwxr-xr-x 1 dave staff 23 Jul 19 10:31 link3 -> /tmp/Dir\ With\ Spaces/
使用反斜杠转义路径中的空格,或者将未转义的路径括在引号中,而不是同时用引号。