copiando um arquivo para um link físico

3

Recentemente fui mordido por um mau comportamento em um script meu e fiquei me perguntando:

  1. é este o comportamento esperado do sistema, ou é um bug
  2. quais são as soluções ideais

Essencialmente, o problema se resumia a isso. Primeiro, eu tinha uma estrutura de diretório existente com o layout a seguir.

  • /opt/dir/file.a
  • /opt/dir/file.b
  • /opt/dir/file

em que file é um link físico para file.a . Eu queria substituir file por um script de shell que selecionou file.a ou file.b dependendo dos parâmetros, então eu corri algo assim:

cp my_file /opt/dir/file

O problema é que, como file é um link físico para file.a , (significando que os dois arquivos são realmente apenas dois nomes para o mesmo inode), a alteração foi refletida em file e file.a . Isso era obviamente não o que eu queria.

Parece que o comando cp abriu efetivamente /opt/dir/file com o sinalizador de arquivo truncado, algo como: fopen("file", "w+") . e escreveu para ele. Eu esperava que ele quebrasse o link físico desde que eu estava copiando um novo arquivo para esse nome.

Este é o comportamento correto e esperado de cp ? Parece não intuitivo para mim. Quando copio um arquivo de um local para outro, em minha mente, estou substituindo-o, não o reescrevendo. Existe um sinalizador para cp para evitar isso? Minha solução atual é que eu rm /opt/dir/file && cp my_file /opt/dir/file .

Olhando para a página de manual, aparece que cp --remove-destination my_file /opt/dir/file pode ser a solução correta, mas ainda estou interessado no que todos têm a dizer sobre o assunto.

    
por Evan Teran 11.09.2013 / 02:13

1 resposta

2

O que você descreve é o comportamento correto para cp , não um bug. Dado o resultado que você está procurando, a modificação que você fez no seu script ( rm seguido por cp ) parece ser a abordagem correta.

    
por 11.09.2013 / 02:28