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 -- '/'
どうすれば解決できますか?
$kernel_version
変数を実際の値に置き換えることをお勧めします。
以下に説明するように、single quoteの代わりにbacktickで以下のコマンドを使用すると、問題も解決するはずです:
$ kernel_version=`uname -r`
@steeldriverで述べたように、エラーはuname -r
コマンドを囲むbacktickの代わりにsingle quoteを使用しているためと思われます。
したがって、次のサンプルコマンド:
$ 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
コマンドの有効なオプションだからです
backtickを使用するとエラーなしで機能することに注意してください。
$ 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
コマンドの置換には、古いスタイルのバックティック`...`
の代わりに$( ... )
表記を使用します。見た目も良く、巣も良くなっています。また、引用符と混同される可能性が低くなります。
変数を引用します。 uname -r
の文字列kernel_version
を使用すると、/lib/modules/$kernel_version/extra/mISDN_core.ko
は2つの単語/lib/modules/uname
と-r/extra/mISDN_core.ko
に展開されます。明らかに1つのファイル名だけが必要な場合。
引用符で囲まれた"/lib/modules/$kernel_version/extra/mISDN_core.ko"
は、単一のWordとして/lib/modules/uname -r/extra/mISDN_core.ko
に展開されますが、その名前のファイルが存在しないため、ln
からエラーが発生します。
ファイル名はスラッシュで始まるため、変数を適切に引用した場合は必ずしも必要ではありませんが、一般的にはオプションの終わりを示す二重ダッシュ--
を追加することを検討できます。ファイル名がダッシュで始まる場合は、オプションとファイル名の違いをアプリケーションが認識できるように使用する必要があります。
古典的な例として、rm *
というファイルを含むディレクトリで-rf
を実行するとどうなるかを考えてください。 rm -- *
は問題を防ぎます(rm ./*
と同様)。
(1)または(2)を実行しないと、ln
は文字列-r/kernel...
を引数の1つとして、またGNU ln
はすべての引数からオプションを読み取り、最初のものだけでなく、-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"