ln: opção inválida - '/'

2

Eu tenho uma situação com ln e não consigo resolver isso mesmo depois de ler sobre ln na ajuda.

Executando o seguinte comando:

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

Fornece o seguinte erro:

ln: invalid option -- '/'

Como posso resolver isso?

    
por Aleksei Kovaltsuk 21.02.2018 / 10:08

2 respostas

6

Sugiro substituir a variável $kernel_version pelo valor real.

Como descrito abaixo, usar o comando abaixo com backtick em vez de aspas simples deve resolver o problema também:

$ kernel_version='uname -r'

Como mencionado por @steeldriver, o erro parece ser devido ao uso de aspas simples ao invés de backtick que cercam o comando uname -r .

daí o seguinte exemplo de comando:

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

Será traduzido para:

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

E como escreveu @steeldriver: presumivelmente, a mensagem de erro é sobre opção inválida '/' porque -r é uma opção válida para o comando ln

Note que o uso do backtick funcionaria sem erros:

$ 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
    
por Yaron 21.02.2018 / 10:33
0
  1. Use a notação $( ... ) em vez das antigas backticks '...' para substituição de comando. Parece melhor e se aninha melhor. E é menos provável que seja misturado com citações.

  2. Cite suas variáveis. Com a string uname -r em kernel_version , /lib/modules/$kernel_version/extra/mISDN_core.ko expande para as duas palavras /lib/modules/uname e -r/extra/mISDN_core.ko , quando você claramente queria apenas um nome de arquivo.

    Citado, "/lib/modules/$kernel_version/extra/mISDN_core.ko" expandiria para /lib/modules/uname -r/extra/mISDN_core.ko como uma única palavra e você receberia um erro de ln porque não existe um arquivo com esse nome.

  3. Não é exatamente necessário aqui se você citou as variáveis corretamente, já que seus nomes de arquivos começam com uma barra, mas em geral você pode considerar adicionar o traço duplo -- para sinalizar o fim das opções. Com nomes de arquivos que começam com traços, ele deve ser usado para que o aplicativo possa dizer a diferença entre uma opção e um nome de arquivo.

    Como exemplo clássico, considere o que acontece se você executar rm * em um diretório que contenha um arquivo chamado -rf . rm -- * impede o problema (assim como rm ./* ).

Sem fazer (1) ou (2), ln realmente vê a string -r/kernel... como um dos argumentos, e como GNU ln lê as opções de todos os argumentos, não apenas os primeiros, é preciso -r como uma opção conhecida e, em seguida, erros em / , pois -/ não é uma opção que ele conhece.

Então, na íntegra, o que você deve fazer é:

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"
    
por ilkkachu 21.02.2018 / 18:17