Execute symlink em diferentes unidades físicas

0

Eu tenho uma pasta no meu HDD /media/kalenpw/HDD/Documents/ShellScripts que está cheia de vários scripts que eu gostaria de ter em qualquer diretório. Minha estratégia anterior era copiar todos os arquivos para /usr/local/bin , mas era entediante ao atualizar scripts que precisavam ser alterados em dois lugares.

Por sorte, recentemente aprendi sobre links simbólicos e eles são perfeitos.

Eu fiz um script de teste na minha pasta pessoal

test.sh

print "Hello"

então eu fiz ln ~/test.sh /usr/local/bin e, como esperado, consegui executar test.sh de qualquer lugar.

O problema que estou tendo é que eu preferiria manter todos os meus documentos no meu disco rígido (no diretório fornecido anteriormente). No entanto, você não pode vincular entre as unidades, então, como esperado, recebi um erro

Invalid cross-device link

então eu tentei fazer um link simbólico assim: sudo ln -s ./test.sh /usr/local/bin/ que criou um link como esperado. No entanto, eu não posso executar test.sh de qualquer diretório (ou mesmo de todo) como eu gostaria. Para garantir que o arquivo não perdeu as permissões na vinculação de /usr/local/bin , eu fiz sudo chmod +x ./test.sh e recebi um erro:

chmod: cannot access './test.sh': Too many levels of symbolic links

Não consigo imaginar que não haja uma maneira de fazer isso, pois parece um uso comum, mas não consegui descobrir como.

Resumo: como criar um link de um arquivo para outro em uma unidade física diferente e ainda manter a capacidade de executar o arquivo vinculado.

    
por kalenpw 14.02.2017 / 07:11

1 resposta

2

1) A maneira correta de acessar muitos scripts é apenas adicionar o diretório no qual os scripts estão em $PATH . Por exemplo, eu tenho meus scripts pessoais em ~/bin , então no meu .profile , eu tenho uma linha

export PATH=$HOME/bin:$PATH

Isso coloca meu ~/bin na frente dos caminhos existentes, então eu posso "sobrescrever" outros programas por ter scripts com o mesmo nome. Se você não quiser, coloque novos diretórios após $PATH .

Portanto, basta adicionar o diretório em que você mantém seus scripts em seu caminho e seu problema está resolvido - completamente sem links simbólicos.

2) Background: Em um determinado sistema de arquivos, os arquivos são identificados usando seu inode number . Um diretório apenas mapeia nomes de arquivos para números de inodes. Se você usar ln sem -s (hardlinks), estará criando uma nova entrada de diretório com o inode de um arquivo existente. Então, obviamente, isso só funciona para arquivos no mesmo sistema de arquivos.

OTOH, se você usa ln -s , você está criando um link simbólico (symlink): Um arquivo especial que tem como conteúdo o caminho especificado, e este caminho é usado no lugar do arquivo quando você tenta acessá-lo. Você não precisa ser root para criar links simbólicos.

3) Quando você executa ln ~/test.sh /usr/local/bin , os comandos ln detectam que /usr/local/bin é um diretório, portanto, ele pressupõe que você realmente queira executar ln ~/test.sh /usr/local/bin/test.sh . O mesmo acontece com -s . É importante ter isso em mente, porque você também pode criar links simbólicos para diretórios. Mas somente o root pode criar hardlinks para diretórios, porque você poderia criar uma estrutura circular de diretórios dessa maneira (e o root deveria saber o suficiente para não fazer isso).

4) Enquanto um link físico tem bits de modo de arquivo, um link simbólico não: Qualquer tentativa de chmod um link simbólico apenas mudará os bits de modo de arquivo no arquivo para o qual aponta.

5) Eu não sei o que aconteceu quando você não pôde executar test.sh , a mensagem de erro Too many levels of symbolic links indica que você tem outros links simbólicos em algum lugar, então algo ficou bagunçado. Eu preciso ver sua estrutura de diretórios para descobrir o que aconteceu.

6) Se você quiser realmente ligar simbolicamente todos os scripts no seu diretório de script para /usr/local/bin/ ao invés de apenas definir o PATH (eu não recomendo isso), considere usar stow : Este programa define muitos links simbólicos de uma só vez. man stow para detalhes.

    
por 14.02.2017 / 10:16