使用 ln -s 建立链接

0 ln

我正在尝试使用以下方法创建链接:

ln -s /Backup files/ /link 1
Run Code Online (Sandbox Code Playgroud)

我没有建立链接,而是得到以下输出:

ln: 目标 '/link' 不是目录

我究竟做错了什么?

Sté*_*las 7

外壳通常会破坏

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选项来避免这种情况。