Apa gunanya perintah eksternal `cd`?

72

Seperti yang dirujuk dalam jawaban yang bagus ini , sistem POSIX memiliki biner eksternal cddi samping shell builtin. Pada OS X 10.8 itu /usr/bin/cd. Anda tidak dapat menggunakannya seperti builtin cdkarena keluar segera setelah mengubah direktori kerjanya sendiri. Apa tujuannya?

kojiro
sumber
Perhatikan bahwa Ubuntu dan CentOS (dan karena itu mungkin Red Hat) tidak memilikinya /usr/bin/cd, hanya shell yang ada di dalamnya.
Keith Thompson
1
Fedora 19 saya termasuk /bin/cd.
slm
1
Debian (saya memeriksa beberapa rilis, termasuk pengujian saat ini) tidak memiliki /bin/cdatau tidak /usr/bin/cd.
derobert
1
Saya kira itu membuat sistem ini tidak sepenuhnya POSIX. Sama seperti orang lain. :)
kojiro

Jawaban:

65

Ini berfungsi terutama untuk memastikan dada alat POSIX tersedia baik di dalam maupun di luar shell (lihat alasan POSIX untuk memerlukannya ).

Sebab cd, itu tidak terlalu berguna tetapi perhatikan bahwa cdmengubah direktori tetapi memiliki efek samping lain: itu mengembalikan status keluar yang membantu menentukan apakah Anda dapat ke chdir()direktori itu atau tidak, dan menampilkan pesan kesalahan yang berguna menjelaskan mengapa Anda tidak bisa chdir()ketika kamu tidak bisa.

Contoh:

dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)

Efek samping potensial lainnya adalah pengotomatisasian direktori.

Pada beberapa sistem, sebagian besar perintah eksternal untuk builtin standar shell diimplementasikan sebagai symlink ke skrip yang sama yang tidak:

#! /bin/sh -
"${0##*/}" "$@"

Itu mulai shell dan jalankan builtin di dalamnya.

Beberapa sistem lain (seperti GNU), memiliki utilitas sebagai perintah yang benar-benar dapat dieksekusi yang dapat menyebabkan kebingungan ketika perilaku berbeda dari versi bawaan shell.

Stéphane Chazelas
sumber
3
+1 untuk pengamatan tentang efek samping dan pesan kesalahan. Tidak selalu dijelaskan dengan baik kepada pengguna baru bahwa banyak idiom pintar di Unix berasal dari penggunaan efek samping yang cermat. Dan halaman manual itu sendiri tidak pernah pandai menggambarkan gambaran yang lebih besar.
RBerteig
Datang ke sini dari pertanyaan serupa pada SO, dapatkah Anda menjelaskan apa yang Anda maksud ketika Anda mengatakan "automounting of a directory"?
mencari
1
@ffledgling, lihat en.wikipedia.org/wiki/Automounter
Stéphane Chazelas
1
Untuk membongkar pemikiran Stéphane Chazelas sedikit: jika Anda perlu memastikan bahwa direktori automoutable sudah terpasang tanpa membuat perubahan di dalamnya dan tanpa membuat upaya untuk membaca file, Anda dapat menggunakan cdperintah eksternal . Mungkin bermanfaat dalam memantau ketersediaan sistem file jarak jauh yang dapat diautomatiskan, atau mungkin sebelum melakukan sesuatu yang sangat penting.
telcoM
11

Fakta non builtin cd perintah yang tersedia pada dasarnya disebabkan oleh POSIX persyaratan untuk semua builtin biasa menjadi callable oleh perintah keluarga exec env, find, nice, nohup, timedan xargsdikombinasikan dengan fakta beberapa perintah ini tidak sedang sendiri dilaksanakan sebagai builtin.

Itu tidak masuk akal karena cdmenggabungkannya dengan perintah-perintah ini sangat tidak berguna. Berikut adalah beberapa contoh yang dapat dipertahankan:

find . -type d -exec cd {} \;
env HOME=/foo cd
Jlliagre
sumber
2
Sejumlah built-in sebenarnya dibebaskan dari aturan itu . Anehnya, cd bukan salah satunya.
Kevin
5
@Kevin saya menulis ini adalah persyaratan untuk semua builtin reguler , yang dikecualikan adalah builtin khusus : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unsettidak akan relevan sebagai perintah eksternal sementara cdbuiltin reguler yang memiliki beberapa kasus penggunaan yang terdokumentasi sebagai perintah.
jlliagre
1

Selain memeriksa apakah jalur sesuai dengan direktori yang dapat diakses, yang cddapat dieksekusi akan memproses dan menggunakan CDPATHvariabel, dan akan mencetak jalur absolut dari direktori yang diselesaikan jika berhasil digunakan.

$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib

Ini hanya sangat berguna sesekali, tetapi akan menghemat penerapan kembali logika yang sama untuk mencari direktori yang cocok. Kasus penggunaan konkret adalah menemukan direktori pertama yang ada dari nama tertentu di bawah beberapa orang tua yang mungkin.

cdjuga proses OLDPWDuntuk cd -, tetapi itu kurang berguna secara konkret karena variabel lingkungan sudah akan tersedia.

Michael Homer
sumber