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

44

Estou usando

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

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

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

    
por solsol 03.06.2010 / 13:32

2 respostas

54

Isso funciona para mim, qual é a saída de strace ln -f -s /var/www/html/releases/build1390 app-current ?

Ah, como é um diretório, você precisa adicionar -n para não cancelar a referência e isso deve resolver o problema. -f é realmente mais uma conveniência, já que adicionar o -f faz com que ele seja desvinculado de qualquer maneira. Embora eu ache que 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 o -n arf ser desreferenciado, ln o tratará como se fosse realmente / . Em seu exemplo específico, se não houver erro, provavelmente você criou um novo link simbólico dentro de /var/www/html/releases/build1390 app-current e desejará limpá-lo.

    
por 03.06.2010 / 13:36
12

Você pode usar -n ou --no-dereference para impedir que o destino seja desreferenciado se for um link simbólico. Você também pode usar -T ou --no-target-directory para garantir que o arquivo de destino seja sempre tratado como um arquivo normal.

Isso produz um comportamento ligeiramente diferente, como mostra o exemplo a seguir. Suponha que src seja algum arquivo, dirlink seja um link simbólico para um diretório e dir seja um diretório real.

Usando -n :

  • ln -sfn src dirlink sobrescreve dirlink e vincula a src
  • ln -sfn src dir cria link dir/src -> src

Usando -T :

  • ln -sfT src dirlink sobrescreve dirlink e vincula a src
  • ln -sfT src dir produz uma mensagem de erro: ln: ‘dir’: cannot overwrite directory
por 11.07.2013 / 12:30