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 -- '/'

Как я могу решить его?

2
задан 21 February 2018 в 12:43

2 ответа

Я предложил бы заменить $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
6
ответ дан 2 December 2019 в 01:42
  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 * в каталоге, содержащем названный файл -rf. rm -- * предотвращает проблему (как был бы rm ./*).

Не делая (1) или (2), ln действительно видит строку -r/kernel... как один из аргументов, и как 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"
0
ответ дан 2 December 2019 в 01:42

Другие вопросы по тегам:

Похожие вопросы: