Apa perbedaan antara perintah yang dibangun di cd dan cd?

Jawaban:

41

The cdperintah built-in, jadi biasanya builtin cdakan melakukan hal yang sama seperti cd. Tetapi ada perbedaan jika cddidefinisikan ulang sebagai suatu fungsi atau alias, dalam hal ini cdakan memanggil fungsi / alias tetapi builtin cdmasih akan mengubah direktori (dengan kata lain, akan membuat built-in dapat diakses bahkan jika dihancurkan oleh suatu fungsi.)

Sebagai contoh:

user:~$ cd () { echo "I won't let you change directories"; }
user:~$ cd mysubdir
I won't let you change directories
user:~$ builtin cd mysubdir
user:~/mysubdir$ unset -f cd  # undefine function

Atau dengan alias:

user:~$ alias cd='echo Trying to cd to'
user:~$ cd mysubdir
Trying to cd to mysubdir
user:~$ builtin cd mysubdir
user:~/mysubdir$ unalias cd  # undefine alias

Menggunakan builtinjuga merupakan cara yang baik untuk mendefinisikan cdfungsi yang melakukan sesuatu dan mengubah direktori (karena memanggil cddarinya hanya akan terus memanggil fungsi lagi dalam rekursi yang tak ada habisnya.)

Sebagai contoh:

user:~ $ cd () { echo "Changing directory to ${1-home}"; builtin cd "$@"; }
user:~ $ cd mysubdir
Changing directory to mysubdir
user:~/mysubdir $ cd
Changing directory to home
user:~ $ unset -f cd  # undefine function
filbranden
sumber
5
+1 Contohnya sangat ilustratif di sini.
Tashus
2
Dalam kasus alias, apakah ada perbedaan antara builtin cd mysubdirdan \cd mysubdir?
gerrit
2
@gerrit Hanya jika ada fungsi bernama cd, dalam hal ini \cdakan memotong alias dan menjalankan fungsi. Lihat stackoverflow.com/a/16506263/4518341
wjandrea
15

Dalam kebanyakan kasus, tidak ada perbedaan (tetapi lihat di bawah). The cdperintah built-in perintah dalam semua kerang. Itu perlu built-in 1 sebagai perintah eksternal tidak dapat mengubah lingkungan shell yang memohon, dan mengubah direktori kerja merupakan perubahan dalam lingkungannya.

The bashperintah builtinpasukan shell untuk menggunakan built-in versi perintah, meskipun mungkin ada fungsi shell, alias, atau perintah eksternal yang tersedia dengan nama yang sama.

Dalam kasus di mana ada adalah misalnya fungsi shell dengan nama cd, maka builtin cdakan tidak menyebutnya. Menggunakan builtin cdmemintas setiap fungsionalitas kelebihan beban yang mungkin telah ditambahkan melalui fungsi shell atau alias oleh pengguna.

Contoh:

The cdbuilt-in command dapat kelebihan beban dengan fungsi yang update prompt:

cd() {
    builtin cd "$@" && PS1=$(__update_prompt)
}

di mana __update_promptada beberapa fungsi lain yang disediakan pengguna yang menghasilkan string.

Di builtin cddalam fungsi tidak akan memanggil fungsi secara rekursif. Menggunakan builtin cddalam shell di mana fungsi ini aktif, juga tidak akan memanggil fungsi.


1 Ada Unices dengan cdperintah eksternal (macOS, dan, saya percaya, Solaris). Tujuan dari perintah itu, yang tidak dapat mengubah direktori kerja untuk sebuah shell, kemungkinan untuk memenuhi standar POSIX, yang terdaftar cdsebagai salah satu utilitas eksternal yang harus tersedia ( cdbukan salah satu dari "utilitas builtin khusus") . Ini juga dapat berfungsi sebagai tes untuk melihat apakah mengubah direktori kerja ke direktori tertentu akan dimungkinkan .

Kusalananda
sumber
FWIW, MacOS juga akan jatuh dalam kategori OS dengan cdperintah eksternal .
yoann
@ Yoann Memang begitu.
Kusalananda
Terima kasih - Anda telah membuat hari saya dengan kedudukan tertinggi, diteliti dengan baik, catatan kaki yang sederhana.
james
kebanyakan shell - ini adalah program eksternal untuk execlineb, tetapi kemudian cd akan mengeksekusi argumen yang tersisa
Grump