sed
tworzy plik tymczasowy, zapisuje dane wyjściowe w tym pliku, a następnie zmienia nazwę pliku tymczasowego na górną część oryginału.
Możesz obserwować, co się dzieje, używając 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 +++
Rejestruje wszystkie operacje na plikach sed
: tworzy nowy plik (bezpiecznie z O_CREAT|O_EXCL
), zapisuje w nim dane, a następnie przenosi go z powrotem na wierzch mojego oryginalnego pliku a
.
sed -i
akceptuje sufiks do użycia jako kopii zapasowej, w takim przypadku najpierw usuwa oryginał (zamiast zmiany nazwy na wierzch). Argument ten jest obowiązkowy w większości BSD sed
. W takim przypadku w katalogu nie ma w ogóle pliku o właściwej nazwie.
perl
w najnowszych wersjach otwiera plik wejściowy, a następnie usuwa go i tworzy nowy plik o tej samej nazwie:
open("a", O_RDONLY) = 3
unlink("a") = 0
open("a", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
Po usunięciu ( unlink
) pliku, który już otworzyłeś, masz do niego dostęp tak długo, jak długo trzymasz uchwyt, aby mógł nadal odczytywać dane z usuniętego pliku. W ten sposób perl
pisze bezpośrednio do pliku wyjściowego, zamiast do pliku tymczasowego: żaden dodatkowy plik jest tworzony, ale jeśli odczytać pliku podczas procesu dostaniesz częściowe treści, w przeciwieństwie do sed
„s podejście. Jest też krótki czas, kiedy nie ma pliku o właściwej nazwie, który jest na początku procesu, a nie na końcu (jak w sed -i .bak
).
Zarówno sed
i perl
będzie:
- Zamień dowiązanie symboliczne na zwykły plik.
- Zerwać twarde linki.
- Jeśli to możliwe, zachowaj własność grupy.
- Utwórz plik ze swoją domyślną grupą (lub grupą katalogu nadrzędnego, jeśli ten katalog ma
setgid
bit), jeśli był własnością grupy, w której nie jesteś i nie jesteś rootem.
- Zachowaj własność pliku, jeśli jesteś rootem.
- Zachowaj podstawowe uprawnienia.
- Zachowaj
setuid
i setgrp
bity, jeśli wynikowa grupa jest taka sama jak grupa, w której zaczął.
- Zachowaj lepki kawałek.
- Nie zachowuj xattrs.
sed
będzie:
- Zachowaj listy ACL (w systemie Linux; nie wiem o innych) .
perl
będzie:
Powyższe dotyczy prawdy w systemie Linux z GNU sed
i Mac OS X z (pochodzącym z FreeBSD) sed
.