Jika saya lakukan: touch file; mv file /dev/null
sebagai root, /dev/null
menghilang. ls -lad /dev/null
tidak menghasilkan file atau direktori seperti itu. Ini memecah aplikasi yang bergantung pada /dev/null
seperti SSH dan dapat diselesaikan dengan melakukan mknod /dev/null c 1 3; chmod 666 /dev/null
. Mengapa memindahkan file biasa ke file khusus ini mengakibatkan hilangnya /dev/null
?
Untuk memperjelas, ini untuk tujuan pengujian, dan saya mengerti bagaimana mv
perintah itu bekerja. Yang saya ingin tahu adalah mengapa ls -la /dev/null
sebelum menggantinya dengan file biasa menunjukkan output yang diharapkan, tetapi kemudian menunjukkan bahwa /dev/null
tidak ada meskipun file itu diduga dibuat melalui mv
perintah asli dan perintah file menunjukkan ASCII Text. Saya pikir ini harus merupakan kombinasi dari ls
perilaku perintah bersama dengan devfs
ketika file non khusus menggantikan karakter / file khusus. Ini pada Mac OS X, perilaku dapat bervariasi pada OS lain.
/dev/null
.rm
perintah.devfs
lucu tentang file normal. Anehnya Anda tidak mendapatkan kesalahan dari itumv
. Bagaimana cara ini:touch testfile; mv testfile /dev
?mv
hanya bisa atom pada sistem file yang sama.Jawaban:
Melihat kode sumber untuk mv, http://www.opensource.apple.com/source/file_cmds/file_cmds-220.7/mv/mv.c :
Pada pass pertama melalui while loop,
open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
akan gagal dengan EEXIST. Kemudian/dev/null
akan dibatalkan tautannya, dan loop diulang. Tetapi seperti yang Anda tunjukkan dalam komentar Anda, file biasa tidak dapat dibuat/dev
, jadi pada putaran berikutnya melalui loop,open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
masih akan gagal.Saya akan mengajukan laporan bug dengan Apple. The
mv
kode sumber sebagian besar tidak berubah dari versi FreeBSD, tetapi karena devfs OSX memiliki perilaku non-POSIX dengan file biasa, Apple harus memperbaiki merekamv
.sumber
Memindahkan file ke lokasi file yang sudah ada menggantikan file yang ada. Dalam hal ini
/dev/null
file perangkat diganti, sama seperti file normal lainnya. Untuk menghindari hal ini, gunakan opsi-i
(interaktif, peringatkan sebelum ditimpa) atau-n
(tanpa clober) untukmv
./dev/null
hanya melakukan fungsi khusus sebagai bit-bucket maka perangkat dibuka apa adanya. Misalnya, ketika>
operator shell digunakan, file dibuka kemudian dipotong (tidak dihapus diganti, yang mungkin seperti yang Anda harapkan). Seperti disebutkan oleh casey, cara yang benar untuk menghapus file adalah denganrm
atau bahkan denganunlink
.sumber
Umm, karena Anda menimpa file khusus dengan yang normal? Apa yang Anda harapkan terjadi?
dev/null
bukan direktori, ini adalah file yang menunjuk ke suatunull
perangkat. Ketika Anda melakukanmv
sesuatu untuk itu, Anda menghapus aslinya dan menggantinya dengan apa pun yang Anda pindah:sumber
/dev/null
, itu hanya menjadi file yang saya pindahkan.