sed geçici bir dosya oluşturur, çıktıyı bu dosyaya yazar ve geçici dosyayı orijinalin üstüne yeniden adlandırır.
Aşağıdakileri kullanarak neler olduğunu izleyebilirsiniz 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 +++
Bu işlem tüm dosya işlemlerini günlüğe kaydeder sed: yeni bir dosya oluşturur (güvenli bir şekilde O_CREAT|O_EXCL), verileri içine yazar ve sonra orijinal dosyamın üzerine geri taşır a.
sed -iyedekleme için kullanılacak bir sonek kabul eder ve bu durumda orijinali önce (yeniden adlandırmak yerine) yoldan çıkarır. Bu argüman BSD'lerin çoğunda zorunludur sed. Bu durumda, dizinde doğru adda hiçbir dosya olmadığında kısa bir süre olur.
perl son sürümlerde girdi dosyasını açar, ardından siler ve aynı adla yeni bir dosya oluşturur:
open("a", O_RDONLY) = 3
unlink("a") = 0
open("a", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
unlinkZaten açık olan bir dosyayı sildiğinizde ( ), tutamacı çevresinde tuttuğunuz sürece ona erişmeye devam edersiniz, böylece verileri silinmiş dosyadan okumaya devam edebilir. Bu şekilde perlgeçici bir dosya yerine doğrudan çıktı dosyasına yazar: ek dosya oluşturulmaz, ancak işlem sırasında dosyayı okursanız, sedyaklaşımından farklı olarak kısmi içerik alırsınız . İşlemin başlangıcında (olduğu gibi sed -i .bak) doğru adda bir dosya olmadığında da kısa bir süre vardır .
Hem sedve perlirade:
- Sembolik bir bağlantıyı sıradan bir dosyayla değiştirin.
- Sabit bağlantıları koparın.
- Mümkünse grup sahipliğini koruyun.
- Dosyayı, içinde olmadığınız
setgidbir gruba aitseniz ve kök değilseniz , varsayılan grubunuzla (veya bu dizinin biti varsa üst dizinin grubuyla ) oluşturun.
- Kökseniz dosya sahipliğini koruyun.
- Temel izinleri koruyun.
- Koruma
setuidve setgrpbitleri halinde elde edilen grup, başlayan grup ile aynıdır.
- Yapışkan ucu koruyun.
- Değil xattrs korumak.
sed niyet:
- ACL'leri koru (Linux'ta; başkalarını bilmiyorum) .
perl niyet:
- Değil EKL'lerini korumak.
Yukarıdakiler GNU içeren Linux sedve (FreeBSD türevi) ile Mac OS X için geçerlidir sed.