como atualizar um destino de link simbólico (ln -f -s não funciona)

como atualizar um destino de link simbólico (ln -f -s não funciona)

estou a usar

ln -f -s /var/www/html/releases/build1390 app-current

para atualizar o link simbólico "app-current" com um novo destino. Porém isso não funciona, o link "app-current" mantém seu destino original, porém não recebo nenhum erro ...

Prefiro não remover o link e recriá-lo, apenas atualizar o destino de um link existente. Isso é possível?

Responder1

Isso funciona para mim, qual é o resultado de strace ln -f -s /var/www/html/releases/build1390 app-current?

Ah, já que é um diretório que você precisa adicionar -npara não desreferenciar e isso deve resolver o problema. -fé realmente mais conveniente, pois adicionar -f apenas faz com que ele seja desvinculado de qualquer maneira. Embora eu ache que isso provavelmente aconteceria algumas centenas de ms mais rápido em um sistema normalmente carregado.

Por exemplo, se arf já aponta para /home:

strace com -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace Sem -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Portanto, sem que o -narf seja desreferenciado, ln o trata como arf como se fosse realmente /. No seu exemplo específico, se não houver erro, acho que você provavelmente criou um novo link simbólico dentro dele /var/www/html/releases/build1390 app-currente desejará limpá-lo.

Responder2

Você pode usar -nou --no-dereferencepara evitar que o alvo seja desreferenciado se for um link simbólico. Você também pode usar -Tou --no-target-directorypara garantir que o arquivo de destinosempreser tratado como um arquivo normal.

Eles produzem um comportamento ligeiramente diferente, como mostra o exemplo a seguir. Suponha srcque seja algum arquivo, dirlinkseja um link simbólico para um diretório e dirseja um diretório real.

Usando -n:

  • ln -sfn src dirlinksubstitui dirlinke vincula-o asrc
  • ln -sfn src dircria linkdir/src -> src

Usando -T:

  • ln -sfT src dirlinksubstitui dirlinke vincula-o asrc
  • ln -sfT src dirproduz uma mensagem de erro:ln: ‘dir’: cannot overwrite directory

informação relacionada