ln:无效选项——‘/’

ln:无效选项——‘/’

我遇到了一种情况,即使我阅读了帮助信息ln后仍然无法解决。ln

运行以下命令:

ln -sf  /lib/modules/$kernel_version/extra/mISDN_core.ko /lib/modules/$kernel_version/kernel/drivers/isdn/mISDN/mISDN_core.ko

提供以下错误:

ln: invalid option -- '/'

我该如何解决?

答案1

我建议$kernel_version用实际值替换变量。

如下所述,使用以下命令反引号代替单引号也应该可以解决问题:

$ kernel_version=`uname -r`

正如 @steeldriver 提到的,错误似乎是由于使用单引号代替反引号围绕uname -r命令。

因此示例命令如下:

$ kernel_version='uname -r'
$ ln -sf /tmp/test/$kernel_version/example /tmp/newname
ln: invalid option -- '/'
Try 'ln --help' for more information.

将被翻译为:

$ ln -sf /tmp/test/uname -r/example /tmp/newname
ln: invalid option -- '/'
Try 'ln --help' for more information.

正如@steeldriver 所写:错误信息大概是关于无效选项'/'因为是命令-r的有效选项ln

请注意,使用反引号不会出现错误:

$ kernel_version=`uname -r`
$ ln -sf /tmp/test/$kernel_version/example /tmp/newname
$ 
$ ls -l /tmp/newname 
lrwxrwxrwx 1 user user 35 Feb 21 16:02 /tmp/newname -> /tmp/test/4.4.0-112-generic/example

答案2

  1. 使用$( ... )符号代替旧式反引号`...`进行命令替换。它看起来更好,嵌套更好。而且不太可能与引号混淆。

  2. uname -r引用您的变量。使用中的字符串kernel_version/lib/modules/$kernel_version/extra/mISDN_core.ko会扩展为两个单词/lib/modules/uname-r/extra/mISDN_core.ko,而您显然只需要一个文件名。

    引用,"/lib/modules/$kernel_version/extra/mISDN_core.ko"将扩展为/lib/modules/uname -r/extra/mISDN_core.ko一个单词,并且您会收到错误,ln因为该名称的文件不存在。

  3. 如果您正确地引用了变量,则这里就没有必要了,因为您的文件名以斜线开头,但通常您可能需要考虑添加双破折号--来表示选项的结束。对于以破折号开头的文件名,必须使用它,以便应用程序可以区分选项和文件名。

    作为一个典型的例子,考虑一下如果你rm *在包含名为 的文件的目录中运行会发生什么-rfrm -- *可以防止该问题(就像 一样rm ./*)。

如果不执行 (1) 或 (2),lnindeed 会将字符串-r/kernel...视为参数之一,并且由于 GNUln从所有参数(而不仅仅是第一个参数)中读取选项,因此它会将其-r作为已知选项,然后在 上出错/,因为-/不是它所知道的选项。

因此,总的来说,你应该做的是:

kernel_version=$(uname -r)
ln -sf -- "/lib/modules/$kernel_version/extra/mISDN_core.ko" \
    "/lib/modules/$kernel_version/kernel/drivers/isdn/mISDN/mISDN_core.ko"

相关内容