Di Linux, setiap entitas dianggap sebagai FILE. Jika saya melakukan vim <cd-Name>
lalu, vim
akan membuka isi direktori ke dalam editornya, karena tidak membedakan antara file dan direktori.
Tapi hari ini saat bekerja, saya menemukan sesuatu yang ingin saya ketahui.
Saya berencana untuk membuka file dari direktori bersarang
vim a/b/c/d/file
Tapi bukannya vim
, saya mengetik
cd a/b/c/d/
dan tekan TAB dua kali, tetapi perintah hanya menampilkan direktori yang tersedia dari direktori “d”, bukan file.
Jangan cd
perintah kehormatan “semuanya adalah file “? Atau apakah saya melewatkan sesuatu?
Jawaban yang Diterima:
“Semuanya adalah file ” frase mendefinisikan arsitektur sistem operasi. Ini berarti bahwa segala sesuatu dalam sistem mulai dari proses, file, direktori, soket, pipa, ... diwakili oleh deskriptor file yang diabstraksikan di atas lapisan sistem file virtual di kernel. Sistem file virtual adalah antarmuka yang disediakan oleh kernel. Oleh karena itu frasa dikoreksi menjadi “Semuanya adalah deskriptor file “. Linus Torvalds sendiri mengoreksinya lagi dengan sedikit lebih tepat:“Semuanya adalah aliran byte “.
Namun, setiap "file" juga memiliki pemilik dan izin yang mungkin Anda ketahui dari file dan direktori biasa. Oleh karena itu, alat Unix klasik seperti cat, ls, ps, ... dapat meminta semua "file" itu dan tidak perlu menemukan mekanisme khusus lainnya, selain alat lama biasa, yang semuanya menggunakan read()
panggilan sistem. Misalnya dalam keluarga OS Microsoft ada beberapa read()
. yang berbeda panggilan sistem (saya mendengar sekitar 15) untuk semua jenis file dan masing-masing sedikit berbeda. Ketika semuanya adalah file, maka Anda tidak membutuhkannya.
Untuk pertanyaan Anda :Tentu saja ada jenis file yang berbeda . Di linux ada 7 jenis file. Direktori adalah salah satunya. Tapi, utilitas dapat membedakan mereka satu sama lain. Misalnya, fungsi lengkap cd
perintah (ketika Anda menekan TAB ) hanya mencantumkan direktori, karena stat()
panggilan sistem (lihat man 2 stat
) mengembalikan struct dengan bidang yang disebut st_mode
. Standar POSIX mendefinisikan apa yang dapat berisi bidang itu:
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
cd
fungsi penyelesaian perintah hanya menampilkan "file" di mana S_ISDIR
bendera disetel.