Eliah melakukan pekerjaan yang bagus untuk menjawab ini, tetapi saya ingin berkomentar tentang bagian "mengapa ada versi lain yang echo
terpisah dari program Bash". Itu pertanyaan yang salah.
Pertanyaan yang tepat adalah: mengapa ini dibangun di tempat pertama , padahal bisa saja (dan) merupakan perintah eksternal yang baik-baik saja?
Untuk kesederhanaan, lihat builtin di dash, 38 sangat sedikit (bash memiliki 61, untuk perbandingan, pergi dengan output dari compgen -b
):
. continue getopts readonly type
: echo hash return ulimit
[ eval jobs set umask
alias exec kill shift unalias
bg exit local test unset
break export printf times wait
cd false pwd trap
command fg read true
Berapa banyak dari ini yang harus dibangun? [
, echo
, false
, printf
, pwd
, test
, Dan true
tidak perlu menjadi builtin: Mereka tidak melakukan apa pun yang hanya builtin dapat melakukan (mempengaruhi atau mendapatkan negara shell yang tidak tersedia untuk perintah eksternal). Bash printf
setidaknya mengambil keuntungan sebagai builtin: printf -v var
menyimpan output ke variabel var
. time
di bash juga istimewa: dengan menjadi kata kunci, Anda dapat mengatur waktu daftar perintah arbitrer di bash (tanda hubung tidak memiliki yang time
setara). pwd
tidak perlu menjadi builtin juga - perintah eksternal apa pun akan mewarisi direktori kerja saat ini (dan itu juga perintah eksternal ).:
adalah pengecualian - Anda memerlukan NOP, dan :
apakah itu. Sisanya melakukan tindakan yang dapat dilakukan dengan mudah oleh perintah eksternal.
Jadi, seperlima dari builtin ini tidak perlu builtin. Lalu mengapa? Halaman dash
manual * sebenarnya menjelaskan secara sepintas mengapa ini adalah bawaan (penekanan milikku):
Dibangun
Bagian ini mencantumkan perintah builtin yang dibangun karena mereka
perlu melakukan beberapa operasi yang tidak dapat dilakukan oleh yang terpisah
proses. Selain itu, ada beberapa perintah lain yang mungkin
dibangun untuk efisiensi (misalnya printf (1), echo (1), test (1), dll).
Cukup banyak: bawaan ini ada karena sering digunakan, secara interaktif dan dalam skrip, dan fungsinya cukup sederhana, sehingga shell dapat melakukan pekerjaannya. Dan itu terjadi: beberapa (? Kebanyakan) kerang mengambil pekerjaan ** Kembali ke. Yangsh
dari 2,9 BSD , dan Anda tidak akan menemukan echo
builtin.
Jadi, sangat mungkin shell minimal dapat melewati implementasi perintah seperti builtin (saya pikir shell saat ini tidak melakukannya). Proyek GNU coreutils tidak berasumsi bahwa Anda akan menjalankannya dalam shell tertentu, dan POSIX membutuhkan perintah ini. Jadi, coreutils menyediakan ini, dan melewatkan yang tidak memiliki makna di luar shell.
* Ini hampir identik dengan teks halaman manual yang sesuai untuk shell Almquist , yang menjadi dasar dasbor itu, shell Debian Almquist, didasarkan.
** zsh
membawa ide ini ke ekstrem: perintah yang Anda dapatkan dengan memuat berbagai modul, seperti zmv
, adalah hal-hal yang Anda pikir tidak perlu dimasukkan ke dalam shell . Pada titik itu, pertanyaan sebenarnya adalah: mengapa Anda menggunakan bash alih-alih zsh, yang memiliki semua bawaan ini?