Meu entendimento básico de um link simbólico é como um arquivo especial, um arquivo que contém um caminho de string para outro arquivo. O VFS do kernel abstrai muito disso, mas há alguma razão pela qual os links simbólicos parecem impossíveis de editar?
Em outras palavras: posso editar um link simbólico? Se não, por que não?
Entendo que existem várias maneiras de substituir os links simbólicos (duas alternativas estão atualmente na seção de respostas), mas seria interessante obter uma explicação sobre por que a substituição parece ser a única maneira de lidar com links simbólicos. Por que você não pode simplesmente mudar para onde eles apontam?
filesystems
symlink
Oli
fonte
fonte
Respostas:
Dado que
-f
apenas faz uma substituição silenciosa, você pode fazer uma substituição atômica commv -T
(-T faz funcionar mesmo que /loc.../link seja um diretório) :linkname
está acessível durante todo o processo.fonte
linkname
não é um link simbólico para um diretório. Use a-T
opção paramv
se no GNU ou-h
no FreeBSD para evitar isso. Observe que assimln -sf
não preserva as permissões do link (nos sistemas em que são significativos).-n
opções, por exemplo:ln -sfn DESTINATION_DIRECTORY LINK_NAME
. Leia mais em askubuntu.com/a/186227/69004Se por edição, você pretende alterar o arquivo para o qual aponta, então sim, você pode:
O
-f
parâmetro (--force
) quando passado para ln faz com que ele chame a chamada dounlink()
sistema logo antessymlink()
Retirado da seguinte resposta de estouro de pilha .
fonte
test
o destino não é um diretório. Caso contrárioln -s -f .profile test
, criaria um.profile
link simbólico nesse diretório. O GNUln
tem uma-T
opção para evitar isso.Links simbólicos precisam ser modificados atomicamente. Se você estiver no meio da escrita, eles não funcionarão. O conteúdo de um link simbólico é muito pequeno (no máximo 4095 caracteres no Linux: o comprimento máximo de um caminho para um arquivo), portanto, não faria sentido editar parte de um link simbólico no nível do kernel. Portanto, o kernel não oferece nenhuma interface para editar um link simbólico, apenas uma interface para criar um novo, a
symlink
chamada do sistema (mais a interface genéricaunlink
para remover qualquer arquivo).A
symlink
chamada do sistema cria apenas um novo link simbólico, não remove nenhum arquivo existente. Isso é irritante, mas consistente com outras chamadas do sistema para criar arquivos comoopen
(que pode criar um novo arquivo ou truncar um arquivo existente, mas não substituir um arquivo existente por um arquivo recém-criado) emkdir
.No shell, como você descobriu , embora não seja possível substituir atomicamente um link simbólico pelo
ln
comando (ln -sf
desvincula o arquivo anterior e cria o link simbólico), você pode fazer isso criando primeiro um link simbólico com um nome temporário e em seguida, movendo-o no lugar.fonte
mv -f
(likeln -sf
) não fará o que você deseja se$link
apontar para um diretório. GNU ln e mv têm um-T
para isso.mv
(renomear chamada do sistema) sempre alterará o inode$link
enquantoln -sfT
(desvincular + link simbólico) pode reutilizar o mesmo.Tecnicamente, não há comando interno para editar um link simbólico existente. Pode ser facilmente alcançado com alguns comandos curtos.
Aqui está uma pequena função bash / zsh que escrevi para atualizar um link simbólico existente:
fonte
Suponha que o nome do link exista como resultado de ter feito (no passado):
Em seguida, existem três maneiras de alterar o link simbólico:
Use ln com
-f
força e até para diretórios-n
(o inode pode ser reutilizado):Remova o link simbólico e crie um novo (mesmo para diretórios):
crie um novo link simbólico e, em seguida,
mv
ele (alteração atômica mesmo para diretórios):fonte