Saya selalu bertanya-tanya mengapa cd
bukan program, tetapi tidak pernah berhasil menemukan jawabannya.
Adakah yang tahu mengapa ini masalahnya?
shell
command
cd-command
shell-builtin
AkshaiShah
sumber
sumber
cd
perintah unix yang asli adalah program yang terpisah. Shell itu menanganinya secara khusus karena tidakfork
, hanya sajaexec
. Dan ketikacd
selesai, itu akan eksekutifsh
. Saya tidak tahu apakah ini kisah nyata.chdir
syscall. sumber: v1 v5 v7 (versi pertama dengan shell Bourne)cd
yang saya baca. Saya jelas salah tentang aspek itu, sekarang @jlliagre telah mengisi detailnya.Jawaban:
The
cd
perintah memodifikasi "direktori kerja saat ini", kan?"direktori kerja saat ini" adalah properti yang unik untuk setiap proses.
Jadi, jika
cd
itu sebuah program, ia akan bekerja seperti ini:cd foo
cd
proses dimulaicd
proses mengubah direktori untuk proses cdcd
keluar prosessumber
cd
suatu program itu akan bekerja seperti ini" harus "ketikacd
digunakan dalam implementasi program eksternal, itu berfungsi seperti ini".cd
selain menjadi builtin shell, sebenarnya juga merupakan program pada OS yang kompatibel dengan POSIX. Mereka harus menyediakan executable independen untuk utilitas reguler, seperticd
. Hal ini misalnya kasus dengan Solaris , AIX , HP-UX dan OS X .Jelas, builtin
cd
masih wajib karena implementasi eksternal tidak mengubah direktori shell saat ini. Namun, yang terakhir masih bisa bermanfaat. Berikut adalah contoh yang menunjukkan bagaimana POSIX membayangkan bagaimanacd
perintah ini dapat digunakan:Pada sistem POSIX, oneliner ini akan melaporkan pesan kesalahan untuk semua direktori yang tidak diizinkan
cd
masuk. Pada sebagian besar distribusi Gnu / Linux, gagal dengan pesan kesalahan itu:Dan inilah jawaban untuk pertanyaan Anda, " Mengapa cd bukan program? " Oleh salah satu penulis Unix yang asli. Pada implementasi Unix yang sangat awal,
cd
(diejachdir
pada waktu itu) adalah program eksternal. Itu hanya berhenti bekerja secara tak terduga setelahfork
pertama kali diterapkan.Mengutip Dennis Ritchie :
Sumber: Dennis M. Ritchie, " Evolusi Sistem Pembagian Waktu Unix ", Jurnal Teknis AT&T Bell 63 (6), Bagian 2, Oktober 1984, hal.1577–93
Unix Version 1 (Maret 1971) halaman manual chdir menyatakan:
Karena proses baru dibuat untuk mengeksekusi setiap perintah, chdir tidak akan efektif jika ditulis sebagai perintah normal. Karena itu diakui dan dieksekusi oleh Shell.
sumber
cd
dieksekusi independen , tetapi itu tidak akan melakukan apa-apa (kecuali mungkin memancarkan pesan kesalahan jika dipanggil dengan argumen yang salah). Aneh.Dari pengantar Bash ( Apa itu shell? ):
sumber
Untuk April Mop tahun ini, saya menulis versi mandiri
cd
.Tidak ada yang punya lelucon. Mendesah.
Siapa pun yang tidak yakin bahwa itu
cd
harus dibangun ke dalam shell harus mengunduhnya, membangunnya, dan mencobanya.Baca halaman manualnya juga. :)
sumber
/bin/cd
. Jika Anda ingin mengambil kode saya dan menjadikannya pencarian pribadi Anda, Anda dapat melakukannya.The
cd
perintah dalam shell tidak bisa menjadi proses yang terpisah karena dalam Unix tidak ada mekanisme untuk mengubah direktori kerja saat ini proses yang berbeda (bahkan tidak proses induk).Jika
cd
proses yang berbeda maka harus mengubah direktori kerja saat ini dari induknya (shell) yang tidak mungkin di Unix. Sebaliknyacd
adalah perintah built-in khusus. Shell memanggil fungsi-fungsi sepertichdir()
danfchdir()
mengubah direktori kerjanya sendiri saat ini.Catatan: kernel menyimpan nomor inode dari direktori kerja saat ini untuk setiap proses. Proses anak mewarisinya
cwd
dari orang tuanya.sumber
cd adalah perintah built-in shell. Semudah ini. Pria itu mengatakan semuanya. perintah cd mengubah direktori kerja untuk semua penerjemah dan (dalam lingkungan berulir) semua utas.
sumber
cd
ada di dalamnya. Saya sarankan Anda membaca jawaban dengan peringkat tertinggi dan mempertimbangkan bagaimana jawaban Anda dapat ditingkatkan.Saya pikir satu hal yang hilang dalam jawaban orang adalah bahwa direktori saat ini adalah variabel lingkungan yang dapat diubah setiap program. Jika Anda menggunakan perintah 'ekspor' untuk melihat daftar variabel lingkungan Anda saat ini, Anda akan memiliki:
dalam hasil Anda. Jadi dengan perintah 'cd' kami hanya ingin memodifikasi variabel internal ini. Saya pikir jika kita mencoba, kita bisa mengejar variabel PWD dari setiap pty di shell, tentu saja. Suka:
Tapi saya pikir tidak perlu dalam kasus normal. Dengan kata lain, kami mengambil bantuan dari bash (atau shell apa pun) untuk memodifikasi variabel internal yang ditentukan.
sumber
..
jalur, bukan jalur tempat Anda memulainya:#include <stdlib.h>
int main(void) { chdir(".."); puts(getenv("PWD")); }
(Kerang C mengekspos CWD sebagai% cwd, omong-omong.)#include <unistd.h>
int main(void) { char ac[99]; setenv("PWD", "/", 1); puts(getcwd(ac, sizeof(ac))); }
Ini akan menunjukkan direktori tempat Anda memulai program, bukan/
.$PWD
hanya berarti bagi kulit Bourne. Ini hanya cara bagi shell untuk mengkomunikasikan sesuatu yang diketahuinya ke shell script sehingga mereka tidak perlu meneleponpwd
untuk menemukannya. Setiap program mandiri tergantung pada nilai$PWD
akan tidak dapat diandalkan.