sed
membuat file sementara, menulis output ke file itu, dan kemudian mengganti nama file sementara di atas yang asli.
Anda dapat menonton apa yang terjadi menggunakan 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 +++
Ini membuat log semua operasi file sed
: itu membuat file baru (aman dengan O_CREAT|O_EXCL
), menulis data ke dalamnya, dan kemudian memindahkannya kembali ke atas file asli saya a
.
sed -i
menerima sufiks yang akan digunakan untuk cadangan, dan dalam kasus itu ia memindahkan yang asli terlebih dahulu (alih-alih mengganti nama di atas). Argumen itu wajib di sebagian besar BSD sed
. Dalam hal ini, ada waktu singkat ketika tidak ada file dengan nama yang tepat di direktori sama sekali.
perl
di versi terbaru buka file input, lalu hapus dan buat file baru dengan nama yang sama:
open("a", O_RDONLY) = 3
unlink("a") = 0
open("a", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
Ketika Anda menghapus ( unlink
) file yang sudah Anda buka, Anda tetap memiliki akses ke sana selama Anda tetap menangani, sehingga bisa terus membaca data dari file yang dihapus. Dengan cara ini perl
menulis langsung ke file output, daripada menjadi file sementara: tidak ada file tambahan yang dibuat, tetapi jika Anda membaca file selama proses Anda akan mendapatkan konten parsial, tidak seperti dengan sed
pendekatan. Ada juga waktu singkat ketika tidak ada file dengan nama yang tepat, yang pada awal proses dan bukan pada akhir (seperti dalam sed -i .bak
).
Keduanya sed
dan perl
akan:
- Ganti tautan simbolik dengan file biasa.
- Hancurkan tautan keras.
- Pertahankan kepemilikan grup jika memungkinkan.
- Buat file dengan grup default Anda (atau grup direktori induk jika direktori tersebut memiliki
setgid
bit) jika file itu dimiliki oleh grup tempat Anda tidak berada dan Anda tidak root.
- Pertahankan kepemilikan file jika Anda melakukan root.
- Pertahankan izin dasar.
- Pertahankan
setuid
dan setgrp
bit, jika grup yang dihasilkan sama dengan grup itu dimulai.
- Pertahankan bagian yang lengket.
- Tidak memelihara xattrs.
sed
akan:
- Pertahankan ACL (Di Linux; Saya tidak tahu tentang orang lain) .
perl
akan:
Hal di atas berlaku di Linux dengan GNU sed
dan Mac OS X dengan (FreeBSD-turunannya) sed
.