Links simbólicos precisam ser modificados atomicamente. Se você está na metade escrevendo, eles não vão funcionar.
O conteúdo de um link simbólico é bem pequeno (no máximo 4095 caracteres no Linux: o comprimento máximo de um caminho para um arquivo), então não haveria muito sentido em 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 chamada de sistema symlink
(mais a interface genérica unlink
para remover qualquer arquivo).
A chamada do sistema symlink
cria apenas um novo link simbólico, ele não remove nenhum arquivo existente. Isso é chato, mas consistente com outras chamadas do sistema para criar arquivos como open
(que pode criar um novo arquivo ou truncar um arquivo existente, mas não substituir um arquivo existente por um arquivo recém-criado) e mkdir
. / p>
No shell, como você descobriu , embora não seja possível substituir um link simbólico atomicamente pelo comando ln
( ln -sf
desvincula o arquivo anterior e cria o link simbólico), você pode criar primeiro um link simbólico em um nome temporário e movê-lo no lugar.
tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"