我遇到了一种情况,即使我阅读了帮助信息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
使用
$( ... )
符号代替旧式反引号`...`
进行命令替换。它看起来更好,嵌套更好。而且不太可能与引号混淆。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
因为该名称的文件不存在。如果您正确地引用了变量,则这里就没有必要了,因为您的文件名以斜线开头,但通常您可能需要考虑添加双破折号
--
来表示选项的结束。对于以破折号开头的文件名,必须使用它,以便应用程序可以区分选项和文件名。作为一个典型的例子,考虑一下如果你
rm *
在包含名为 的文件的目录中运行会发生什么-rf
。rm -- *
可以防止该问题(就像 一样rm ./*
)。
如果不执行 (1) 或 (2),ln
indeed 会将字符串-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"