web-dev-qa-db-fra.com

ln: option non valide - '/'

J'ai un problème avec ln et je ne peux pas le résoudre même après avoir lu des informations sur ln dans l'aide.

Lancer la commande suivante:

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

Fournit l'erreur suivante:

ln: invalid option -- '/'

Comment puis-je le résoudre?

2
Aleksei Kovaltsuk

Je suggérerais de remplacer la variable $kernel_version par la valeur réelle.

Comme décrit ci-dessous, à l'aide de la commande ci-dessous avec en arrière au lieu de guillemet simple devrait également résoudre le problème:

$ kernel_version=`uname -r`

Comme mentionné par @steeldriver, l'erreur semble être due à l'utilisation de guillemets simples au lieu de backtick qui entoure la commande uname -r.

d'où l'exemple de commande suivant:

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

Sera traduit à:

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

Et comme @steeldriver a écrit: Le message d'erreur concerne probablement option non valide '/' car -r est une option valide pour la commande ln

Notez que l'utilisation de backtick fonctionnerait sans erreur:

$ 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
6
Yaron
  1. Utilisez la notation $( ... ) à la place des backticks de style ancien `...` pour la substitution de commande. Il a l'air mieux et niche mieux. Et est moins susceptible d'être mélangé avec des citations.

  2. Citez vos variables. Avec la chaîne uname -r dans kernel_version, /lib/modules/$kernel_version/extra/mISDN_core.ko se développe en deux mots /lib/modules/uname et -r/extra/mISDN_core.ko, alors que vous vouliez clairement un seul nom de fichier.

    Cité, "/lib/modules/$kernel_version/extra/mISDN_core.ko" se développerait en /lib/modules/uname -r/extra/mISDN_core.ko comme un mot unique et vous obtiendrez une erreur de ln car un fichier portant ce nom n'existe pas.

  3. Ce n'est pas vraiment nécessaire ici si vous avez correctement cité les variables, car vos noms de fichiers commencent par une barre oblique, mais en général, vous pouvez envisager d'ajouter le double tiret -- pour signaler la fin des options. Les noms de fichiers commençant par des tirets doivent être utilisés afin que l'application puisse faire la différence entre une option et un nom de fichier.

    Comme exemple classique, considérons ce qui se passe si vous exécutez rm * dans un répertoire contenant un fichier appelé -rf. rm -- * empêche le problème (comme rm ./*).

Sans faire (1) ou (2), ln voit bien la chaîne -r/kernel... comme un des arguments, et comme GNU ln lit les options de tous les arguments, pas seulement les premiers, il prend -r comme une option connue, puis des erreurs sur /, puisque -/ n'est pas une option connue.

Donc, en gros, ce que vous devriez faire, c'est:

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"
0
ilkkachu