Como evitar que o symlink crie dentro de si mesmo?

1

A execução do seguinte comando funciona conforme o esperado, criando um link simbólico para src de include/bb :

ln -sf ../src include/bb

No entanto, chamar o mesmo comando novamente fará com que um symlink adicional para src seja criado em include/bb aka src/src .

O que posso fazer para evitar isso?

Editar:

Aparentemente isso acontece quando ln é chamado duas vezes, possivelmente o ponto-e-vírgula não tem nada a ver com isso, afinal.

Aqui está uma sequência de comandos que fará com que isso aconteça:

mkdir test
cd test
mkdir src
touch src/main.cpp
mkdir include
ln -sf ../src include/bb
ln -sf ../src include/bb
    
por zennehoy 04.03.2016 / 09:51

2 respostas

4
ln -s ../src include/bb

cria um link chamado include/bb referente a ../src (relativo a sua localização) ou cria um arquivo include/bb/src referente a ../src (relativo a sua localização). O último é o caso se include/bb existir e for um diretório (na verdade ou como um link para um diretório).

Assim, quando você tiver feito o comando uma vez, agora há um link include/bb que aponta o diretório src , irmão para include . Ou seja, include/bb agora é um diretório. Portanto, quando você faz o comando na hora subseqüente, um novo link chamado src é adicionado a esse diretório.

Não tem nada a ver com ; .

Você pode ter pretendido usar

ln -sTf ../src include/bb

em vez disso, para (por -T ) informar ln para tratar qualquer include/bb existente como um arquivo simples (mesmo que seja um link que faça referência a um diretório) e (por -f ) forçar esse arquivo a ser substituído.

    
por 04.03.2016 / 10:16
1

Quando você corre

ln -s ../src include/bb
ln -s ../src include/bb

a primeira linha faz um link include/bb para o diretório ../src (que é o que você esperava).

O segundo acha que include/bb já existe. Se fosse um arquivo regular, ou um link simbólico para um arquivo regular, isso seria um erro (a menos que você desse também -f ). Em vez disso, é um link simbólico para o diretório ../src , criado na etapa anterior. Quando o operando de destino de ln é um diretório :

the ln utility shall create a new [...] symbolic link, for each file specified by a source_file operand, at a destination path in the existing directory named by target_dir.

Então, desta vez, você está pedindo para criar um link para ../src dentro de include/bb/ , que é (um link para) um diretório. Esses links são nomeados por padrão de acordo com seus nomes de base existentes, o que é src neste caso. Se você executou uma terceira vez, receberá um erro porque ../src/src existe agora.

Você pode evitar isso excluindo o link include/bb de antemão todas as vezes com rm include/bb . O ponto e vírgula não está envolvido nisso.

    
por 04.03.2016 / 10:17

Tags