sed
cria um arquivo temporário, grava a saída nesse arquivo e, em seguida, renomeia o arquivo temporário na parte superior do original.
Você pode assistir ao que acontece usando strace
:
$ strace -e trace=file sed -i -e '' a
execve("/usr/bin/sed", ["sed", "-i", "-e", "", "a"], [/* 34 vars */]) = 0
<...trimmed...>
open("a", O_RDONLY) = 3
open("./sedxvhRY8", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
rename("./sedxvhRY8", "a") = 0
+++ exited with 0 +++
Isso registra todas as operações de arquivo sed
makes: cria um novo arquivo (com segurança em O_CREAT|O_EXCL
), grava os dados nele e, em seguida, o move de volta para o início do arquivo original a
. / p>
sed -i
aceita um sufixo para usar como backup e, nesse caso, ele move o original para fora do caminho primeiro (em vez de renomear por cima). Esse argumento é obrigatório na maioria dos BSD sed
s. Nesse caso, há um breve tempo em que não há nenhum arquivo com o nome certo no diretório.
perl
nas versões recentes abre o arquivo de entrada, exclui e cria um novo arquivo com o mesmo nome:
open("a", O_RDONLY) = 3
unlink("a") = 0
open("a", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
Quando você exclui ( unlink
) um arquivo que você já tem aberto, você mantém o acesso para ele, enquanto você mantiver a alça ao redor, para que ele possa continuar lendo os dados do arquivo excluído. Desta forma, perl
escreve 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, diferente da abordagem de sed
. Há também um breve momento em que não há nenhum arquivo com o nome certo, que está no início do processo, e não no final (como em sed -i .bak
).
Tanto sed
como perl
serão:
- Substitua um link simbólico por um arquivo comum.
- Quebre os links físicos.
- Preserve a propriedade do grupo, se possível.
- Crie o arquivo com seu grupo padrão (ou o grupo do diretório pai, se esse diretório tiver o
setgid
bit), se ele pertencesse a um grupo no qual você não está e você não é root. - Preserve a propriedade do arquivo se você for root.
- Preserve permissões básicas.
- Preserve
setuid
esetgrp
bits, se o grupo resultante for o mesmo do grupo em que começou. - Preserve o bit adesivo.
- Não preserva xattrs.
sed
:
- Preservar ACLs (No Linux, não sei sobre os outros)
perl
:
- Não preserva as ACLs.
O acima é verdadeiro no Linux com o GNU sed
e o Mac OS X com o seu (derivado do FreeBSD) sed
.