O que significa a modificação "local" de um arquivo, por exemplo, via sed -i
ou perl -i
significa?
Minha pergunta é sobre como é feita essa modificação no local. O arquivo foi copiado, a modificação é feita na cópia e substituída pelo original? Ou o arquivo original está sendo modificado de alguma maneira?
10
ex
ouvi
?ex
mantém um arquivo de mensagens (como,dead.mail
ou algo em ~ você, e outro em algum lugar próximo ao seu spooler de mensagens, geralmente) . verifique as especificações - cada uma delas possui um estado definido para grandes comprimentos ...ex
tem seu próprio formato binário na maioria dos casos (veja o seu-rescue
arquivo) e isso é usado para pré-zerar arquivos buffer temporários separados (possivelmente até seis) . Então, esses blocos de entrada são copiados para editar buffers e gravações sincronizadas em offsets por alterações:!written
?Respostas:
sed
cria um arquivo temporário, grava a saída nesse arquivo e renomeia o arquivo temporário por cima do original.Você pode assistir ao que acontece usando
strace
:Isso registra todas as operações de arquivo
sed
efetuadas: cria um novo arquivo (com segurançaO_CREAT|O_EXCL
), grava os dados nele e depois move-os de volta ao topo do meu arquivo originala
.sed -i
aceita um sufixo para usar como backup e, nesse caso, move o original primeiro (em vez de renomear por cima). Esse argumento é obrigatório na maioria dos BSDssed
. Nesse caso, há um breve momento em que não há nenhum arquivo com o nome correto no diretório.perl
nas versões recentes abre o arquivo de entrada, exclui-o e cria um novo arquivo com o mesmo nome:Quando você exclui (
unlink
) um arquivo que você já abriu, você mantém o acesso a ele enquanto mantiver o controle, para que ele continue lendo os dados do arquivo excluído. Dessa maneira,perl
grava diretamente no arquivo de saída, em vez de em um arquivo temporário: nenhum arquivo adicional é criado, mas se você ler o arquivo durante o processo, obterá conteúdo parcial, ao contráriosed
da abordagem. Também há um breve momento em que não há arquivo com o nome correto, que está no início do processo e não no final (como emsed -i .bak
).Ambos
sed
eperl
irão:setgid
bit), se pertencesse a um grupo em que você não pertence e não é root.setuid
esetgrp
bits, se o grupo resultante for o mesmo que o grupo em que foi iniciado.sed
vai:perl
vai:O acima é verdade no Linux com GNU
sed
e Mac OS X (derivado do FreeBSD)sed
.fonte
Além da resposta de @ Homer, de
perldoc perlrun
:E lembre-se de que nenhum link flexível ou físico é preservado:
Isso também explica por que você deve usar
-i
com a-p
opção ou usar umaprint
instrução explícita se desejar editar no local comperl
:fonte