0 ln
我正在尝试使用以下方法创建链接:
ln -s /Backup files/ /link 1
Run Code Online (Sandbox Code Playgroud)
我没有建立链接,而是得到以下输出:
ln: 目标 '/link' 不是目录
我究竟做错了什么?
外壳通常会破坏
ln -s /Backup files/ /link 1
Run Code Online (Sandbox Code Playgroud)
命令行输入这些词:
ln
-s
/Backup
files/
/link
1
从第一个单词,它将派生要执行的命令(类似于/bin/ln
通过搜索$PATH
变量中列出的所有目录以查找名为 的文件ln
),并将所有这些单词作为单独的参数传递给该/bin/ln
可执行文件。
ln
将把第二个参数 ( -s
)理解为一个选项,这意味着创建符号链接而不是硬链接,然后将其余的作为一些非选项参数。当ln
接收到两个以上的非选项参数时,它会将最后一个理解为一个目录,在其中创建指向其他参数的符号链接。
所以,这要求ln
创建 3 个符号链接:
1/Backup
-> /Backup
1/files
-> files/
1/link
-> /link
如果1
目录不存在或者它不是类型directory 的文件,它会抱怨。
如果您想ln
创建一个/link 1
指向/Backup files/
¹的符号链接,您需要将这些参数传递给ln
:
ln
-s
/Backup files/
/link 1
在大多数 shell 中,这可以通过以下方式完成:
ln -s '/Backup files/' '/link 1'
Run Code Online (Sandbox Code Playgroud)
该'
字符,如空格字符,是shell语法的一部分。在这里,他们习惯于告诉里面的任何东西'...'
都应该按字面意思对待。具体来说,空格字符失去了其作为参数定界符的意义,而是按字面包含在传递给 的参数中ln
。有些shell的实现支持更多报价运营商如"..."
,$'...'
,$"..."
或反斜杠。在类似 Korn 的 shell 中bash
,所有这些都是等价的:
ln -s "/Backup files/" "/link 1"
ln -s $'Backup files/' $'/link 1'
ln -s Backup\ files/ /link\ 1
Run Code Online (Sandbox Code Playgroud)
您当然可以将它们组合起来,例如:
'ln' "-"'s' "Back"up\ files/ ''""/link' '$'1'
Run Code Online (Sandbox Code Playgroud)
¹ 请注意,如果link 1
存在并且类型为目录(或符号链接最终解析为目录),ln -s 'Backup files/' '/link 1'
实际上会Backup files
在该目录中创建一个符号链接(a /link 1/Backup files
->/Backup files/
符号链接)。使用 GNU ln
,您可以通过使用该-T
选项来避免这种情况。