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 -i
yedekleme 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
unlink
Zaten 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 perl
geçici bir dosya yerine doğrudan çıktı dosyasına yazar: ek dosya oluşturulmaz, ancak işlem sırasında dosyayı okursanız, sed
yaklaşı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 sed
ve perl
irade:
- 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
setgid
bir 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
setuid
ve setgrp
bitleri 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 sed
ve (FreeBSD türevi) ile Mac OS X için geçerlidir sed
.