Apa yang dimaksud dengan "inplace" modifikasi file misalnya via sed -i
atau perl -i
artinya?
Pertanyaan saya adalah tentang bagaimana modifikasi inplace ini dilakukan. Apakah file yang disalin modifikasi dilakukan dalam salinan dan kemudian ganti yang asli? Atau apakah file asli entah bagaimana sedang dimodifikasi di tempat?
10
ex
atauvi
?ex
memelihara filefile (seperti,dead.mail
atau sesuatu di ~ Anda, dan tempat lain yang dekat dengan spooler email Anda, biasanya) . periksa spesifikasi - masing-masing dari mereka memiliki status yang didefinisikan dengan panjang lebar ...ex
memiliki format biner sendiri dalam banyak kasus (lihat-rescue
file Anda ) dan ini digunakan untuk prezero file buffer sementara yang terpisah (mungkin sebanyak enam) . jadi ini menyalin blok input untuk mengedit buffer dan menyinkronkan penulisan ke dalam offset per perubahan:!written
?Jawaban:
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
:Ini membuat log semua operasi file
sed
: itu membuat file baru (aman denganO_CREAT|O_EXCL
), menulis data ke dalamnya, dan kemudian memindahkannya kembali ke atas file asli sayaa
.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 BSDsed
. 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: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 iniperl
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 dengansed
pendekatan. Ada juga waktu singkat ketika tidak ada file dengan nama yang tepat, yang pada awal proses dan bukan pada akhir (seperti dalamsed -i .bak
).Keduanya
sed
danperl
akan:setgid
bit) jika file itu dimiliki oleh grup tempat Anda tidak berada dan Anda tidak root.setuid
dansetgrp
bit, jika grup yang dihasilkan sama dengan grup itu dimulai.sed
akan:perl
akan:Hal di atas berlaku di Linux dengan GNU
sed
dan Mac OS X dengan (FreeBSD-turunannya)sed
.sumber
Sebagai tambahan dari jawaban @ Homer, dari
perldoc perlrun
:Dan ingat bahwa, tidak ada tautan lunak atau tautan keras yang dipertahankan:
Ini juga menjelaskan mengapa Anda harus menggunakan
-i
dengan-p
pilihan, atau menggunakan eksplisitprint
pernyataan jika Anda ingin mengedit inplace denganperl
:sumber