Di dalam manual bash , tertulis itu
Builtin commands are contained >>> within <<< the shell itself
Juga, jawaban ini menyatakan itu
A built-in command is simply a command that the shell carries out itself,
instead of interpreting it as a request to load and run some
>>> other program <<<
Ketika saya menjalankan compgen -b
pada bash 4.4
, saya menerima daftar semua shell builtin perintah. Saya melihat contohnya [
dan kill
terdaftar sebagai builtin shell. Tapi lokasi sebenarnya adalah:
/usr/bin/[
/bin/kill
Saya berpikir bahwa menjadi builtin
sarana bahwa perintah dikompilasi ke dalam /bin/bash
executable. Jadi apa yang benar-benar membingungkan saya: Tolong perbaiki saya, tetapi bagaimana perintah yang terpisah bisa menjadi builtin
, padahal sebenarnya itu bukan bagian dari shell?
bash
shell
shell-builtin
perwujudan
sumber
sumber
exec
memanipulasi file deskriptor daneval
untuk mengevaluasi perintah. Mereka tidak diperlukan sebagai perintah mandiriJawaban:
Perintah-perintah yang dibangun ke dalam shell sering dibangun karena peningkatan kinerja yang memberi ini. Memanggil eksternal
printf
, misalnya, lebih lambat daripada menggunakan built-inprintf
.Karena beberapa utilitas tidak perlu dibangun, kecuali mereka khusus, seperti
cd
, mereka juga disediakan sebagai utilitas eksternal . Ini adalah agar skrip tidak akan rusak jika mereka diinterpretasikan oleh shell yang tidak menyediakan built in yang setara.Built-in beberapa shell juga menyediakan ekstensi untuk perintah setara eksternal. Bash
printf
, misalnya mampu melakukannya(cetak ke variabel) yang
/usr/bin/printf
tidak bisa dilakukan eksternal karena tidak memiliki akses ke variabel shell di sesi shell saat ini (dan tidak dapat mengubahnya).Utilitas bawaan juga tidak memiliki batasan bahwa baris perintah yang diperluas harus lebih pendek dari panjang tertentu. Perbuatan
Oleh karena itu aman jika
printf
perintah built-in shell. Pembatasan pada panjang baris perintah berasal dari fungsiexecve()
C library yang digunakan untuk mengeksekusi perintah eksternal. Jika baris perintah dan lingkungan saat ini lebih besar dariARG_MAX
byte (lihatgetconf ARG_MAX
di shell), panggilan keexecve()
akan gagal. Jika utilitas dibangun ke dalam shell,execve()
tidak harus dipanggil.Utilitas bawaan lebih diutamakan daripada utilitas yang ditemukan di
$PATH
. Untuk menonaktifkan perintah bawaanbash
, gunakan misAda daftar pendek utilitas yang perlu dibangun ke dalam shell (diambil dari daftar standar built-in khusus POSIX )
Ini perlu dibangun karena mereka secara langsung memanipulasi lingkungan dan aliran program dari sesi shell saat ini. Utilitas eksternal tidak akan dapat melakukan itu.
Menariknya,
cd
bukan bagian dari daftar ini, tetapi POSIX mengatakan yang berikut tentang itu:Karena itu saya berasumsi bahwa built-in "khusus" tidak dapat memiliki rekan eksternal, sedangkan
cd
secara teori bisa saja (tetapi itu tidak akan berbuat banyak).sumber
chdir
/cd
adalah binari eksternal di dalam Unix / pra-Unix yang sangat awal sebelumfork
diperkenalkan./usr/bin/cd
, tetapi itu tidak akan benar-benar mengubah direktori kerja saat ini. Manualnya mengatakan:/usr/bin/cd
tidak berpengaruh pada proses pemanggilan tetapi dapat digunakan untuk menentukan apakah direktori yang diberikan dapat ditetapkan sebagai direktori saat ini.kill
juga bagus karena tidak perlu melakukan proses lain, bagus jika Anda telah mencapai batas jumlah proses Anda.Anda (sangat dimengerti) bingung oleh kenyataan bahwa beberapa builtin ada baik sebagai builtin maupun sebagai perintah eksternal. Jadi, sementara Anda benar bahwa, misalnya, ada
/bin/[
perintah, itu tidak berarti bahwa "lokasi sebenarnya" ada di/bin
.Cara mudah apa pun untuk menguji ini adalah menjalankannya
type
dengan-a
sakelar yang akan menampilkan semua instance perintah yang tersedia. Di sistem Arch saya, itu menunjukkan:Perhatikan itu
/sbin
,/usr/sbin
dan/bin
semua symlink mengarah ke/usr/bin
, jadi hanya ada satu eksternal[
:Seperti yang Anda lihat,
[
keduanya adalah builtin dan perintah eksternal, dan hal yang sama berlaku untuk berbagai builtin shell lainnya. Namun, itu tidak mengubah fakta bahwa mereka juga shell builtin, dikompilasi ke dalam shell itu sendiri.sumber
/bin/printf
diinstal olehcoreutils
paket dan/bin/kill
olehutil-linux
.