sed
crea un file temporaneo, scrive l'output in quel file e quindi rinomina il file temporaneo sopra l'originale.
Puoi vedere cosa succede 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 +++
In questo modo vengono registrate tutte le operazioni sui file sed
: crea un nuovo file (in modo sicuro con O_CREAT|O_EXCL
), scrive i dati in esso e quindi li sposta di nuovo sopra il mio file originale a
.
sed -i
accetta un suffisso da utilizzare per un backup e in tal caso sposta prima l'originale (anziché rinominarlo in alto). Tale argomento è obbligatorio nella maggior parte dei BSD sed
. In questo caso, c'è un breve periodo in cui non ci sono file con il nome giusto nella directory.
perl
nelle versioni recenti apre il file di input, quindi lo elimina e crea un nuovo file con lo stesso nome:
open("a", O_RDONLY) = 3
unlink("a") = 0
open("a", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
Quando elimini ( unlink
) un file che hai già aperto, ne conservi l'accesso fintanto che mantieni il punto di controllo, in modo che possa continuare a leggere i dati dal file eliminato. In questo modo perl
scrive direttamente nel file di output, piuttosto che in un file temporaneo: non viene creato alcun file aggiuntivo, ma se si legge il file durante il processo si otterrà un contenuto parziale, diversamente sed
dall'approccio. C'è anche un breve periodo in cui non esiste un file con il nome giusto, che è all'inizio del processo piuttosto che alla fine (come in sed -i .bak
).
Entrambi sed
e perl
volontà:
- Sostituisci un collegamento simbolico con un file normale.
- Rompere i collegamenti duri.
- Preservare la proprietà del gruppo, se possibile.
- Crea il file con il tuo gruppo predefinito (o il gruppo della directory padre se quella directory ha il
setgid
bit) se era di proprietà di un gruppo in cui non sei e non sei root.
- Mantieni la proprietà dei file se sei root.
- Conserva le autorizzazioni di base.
- Conserva
setuid
e setgrp
bit, se il gruppo risultante è uguale al gruppo nel quale è stato avviato.
- Preservare la parte adesiva.
- Non conservare xattrs.
sed
volontà:
- Preservare gli ACL (su Linux; non conosco altri) .
perl
volontà:
Quanto sopra è vero su Linux con GNU sed
e Mac OS X con i suoi (derivati da FreeBSD) sed
.