Entendo muito bem a noção de hardlinks e li as páginas de manual para obter ferramentas básicas como cp
--- e até as especificações recentes do POSIX --- várias vezes. Ainda fiquei surpreso ao observar o seguinte comportamento:
$ echo john > john
$ cp -l john paul
$ echo george > george
Neste ponto john
e paul
terá o mesmo nodo (e conteúdo), e george
serão diferentes em ambos os aspectos. Agora fazemos:
$ cp george paul
Nesse ponto, eu esperava george
e paul
ter números de inode diferentes, mas o mesmo conteúdo - essa expectativa foi atendida -, mas também esperava paul
agora ter um número de inode diferente john
e john
ainda ter o conteúdo john
. Foi aqui que fiquei surpresa. Acontece que copiar um arquivo para o caminho de destino paul
também resulta na instalação desse mesmo arquivo (mesmo inode) em todos os outros caminhos de destino que compartilham paul
o inode. Eu estava pensando que cp
cria um novo arquivo e o move para o local anteriormente ocupado pelo arquivo antigo paul
. Em vez disso, o que parece fazer é abrir o arquivo existente paul
, truncá-lo e gravargeorge
o conteúdo desse arquivo existente. Portanto, qualquer "outro" arquivo com o mesmo inode recebe "seu" conteúdo atualizado ao mesmo tempo.
Ok, esse é um comportamento sistemático e, agora que sei esperar, posso descobrir como contornar ou tirar proveito disso, conforme apropriado. O que me intriga é onde eu deveria ver esse comportamento documentado? Eu ficaria surpreso se não estiver documentado em algum lugar nos documentos que eu já olhei. Mas, aparentemente, eu senti falta disso, e agora não consigo encontrar uma fonte que discuta esse comportamento.