Saya curiga mengapa ada banyak hubungannya dengan visi / desain yang berbentuk Unix (dan akibatnya Linux), dan keuntungan yang berasal dari itu.
Tidak diragukan lagi ada manfaat kinerja yang tidak dapat diabaikan untuk tidak memutar proses tambahan, tapi saya pikir ada lebih dari itu: Early Unix memiliki metafora "semuanya adalah file", yang memiliki keuntungan yang tidak jelas namun elegan jika Anda melihat itu dari perspektif sistem, bukan dari perspektif skrip shell.
Katakanlah Anda memiliki null
program command-line Anda, dan /dev/null
simpul perangkat. Dari perspektif shell-scripting, foo | null
program ini benar-benar berguna dan nyaman , dan foo >/dev/null
membutuhkan sedikit waktu lebih lama untuk mengetik dan bisa terasa aneh.
Tapi inilah dua latihan:
Mari kita melaksanakan program null
menggunakan alat Unix yang ada dan /dev/null
- mudah: cat >/dev/null
. Selesai.
Anda dapat menerapkan /dev/null
dalam hal null
?
Anda memang benar bahwa kode C untuk hanya membuang input itu sepele, jadi mungkin belum jelas mengapa ada file virtual yang tersedia untuk tugas tersebut.
Pertimbangkan: hampir setiap bahasa pemrograman sudah perlu bekerja dengan file, deskriptor file, dan path file, karena mereka adalah bagian dari paradigma "semuanya adalah file" dari awal.
Jika semua yang Anda miliki adalah program yang menulis ke stdout, well, program tidak peduli jika Anda mengarahkan mereka ke file virtual yang menelan semua penulisan, atau pipa ke program yang menelan semua penulisan.
Sekarang jika Anda memiliki program yang mengambil jalur file untuk membaca atau menulis data (yang dilakukan sebagian besar program) - dan Anda ingin menambahkan fungsionalitas "input kosong" atau "buang hasil ini" ke program-program tersebut - yah, dengan /dev/null
yang gratis.
Perhatikan bahwa keanggunannya adalah mengurangi kompleksitas kode dari semua program yang terlibat - untuk setiap usecase umum-tetapi-khusus yang dapat disediakan oleh sistem Anda sebagai "file" dengan "nama file" yang sebenarnya, kode Anda dapat menghindari penambahan perintah kustom Opsi-line dan jalur kode khusus untuk ditangani.
Rekayasa perangkat lunak yang baik sering tergantung pada menemukan metafora yang baik atau "alami" untuk mengabstraksi beberapa elemen masalah dengan cara yang menjadi lebih mudah untuk dipikirkan tetapi tetap fleksibel , sehingga Anda dapat memecahkan berbagai masalah tingkat tinggi yang pada dasarnya sama tanpa harus menghabiskan waktu dan energi mental untuk mengimplementasikan kembali solusi untuk masalah tingkat rendah yang sama secara konstan.
"Semuanya adalah file" tampaknya menjadi salah satu metafora untuk mengakses sumber daya: Anda memanggil open
jalur yang diberikan dalam namespace heirarkis, mendapatkan referensi (deskriptor file) ke objek, dan Anda dapat read
dan write
, dll pada deskriptor file. Stdin / stdout / stderr Anda juga deskriptor file yang baru saja dibuka sebelumnya untuk Anda. Pipa Anda hanyalah file dan deskriptor file, dan pengalihan file memungkinkan Anda merekatkan semua bagian ini.
Unix berhasil seperti halnya sebagian karena seberapa baik abstraksi ini bekerja bersama, dan /dev/null
paling baik dipahami sebagai bagian dari keseluruhan itu.
PS Ada baiknya melihat versi Unix dari "semuanya adalah file" dan hal-hal seperti /dev/null
sebagai langkah pertama menuju generalisasi metafora yang lebih fleksibel dan kuat yang telah diterapkan di banyak sistem yang mengikuti.
Sebagai contoh, di Unix objek seperti file khusus seperti /dev/null
harus diimplementasikan dalam kernel itu sendiri, tetapi ternyata cukup berguna untuk mengekspos fungsionalitas dalam bentuk file / folder yang sejak itu banyak sistem telah dibuat yang menyediakan jalan bagi program untuk melakukannya.
Salah satu yang pertama adalah sistem operasi Plan 9, yang dibuat oleh beberapa orang yang sama yang membuat Unix. Kemudian, GNU Hurd melakukan sesuatu yang mirip dengan "penerjemahnya". Sementara itu, Linux akhirnya mendapatkan FUSE (yang telah menyebar ke sistem arus utama lainnya sekarang juga).
cat foo | bar
jauh lebih buruk (pada skala) daripadabar <foo
.cat
adalah program sepele, tetapi bahkan sebuah program sepele menciptakan biaya (beberapa di antaranya khusus untuk semantik FIFO - karena program tidak dapatseek()
di dalam FIFO, misalnya, sebuah program yang dapat diimplementasikan secara efisien dengan pencarian dapat berakhir dengan melakukan operasi yang jauh lebih mahal. ketika diberi saluran pipa; dengan perangkat karakter seperti/dev/null
itu dapat memalsukan operasi tersebut, atau dengan file nyata dapat menerapkannya, tetapi FIFO tidak mengizinkan segala jenis penanganan sadar kontekstual).