Perintah-perintah yang dibangun ke dalam shell sering dibangun karena peningkatan kinerja yang memberi ini. Memanggil eksternal printf
, misalnya, lebih lambat daripada menggunakan built-in printf
.
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
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
(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
printf '%s\n' *
Oleh karena itu aman jika printf
perintah built-in shell. Pembatasan pada panjang baris perintah berasal dari fungsi execve()
C library yang digunakan untuk mengeksekusi perintah eksternal. Jika baris perintah dan lingkungan saat ini lebih besar dari ARG_MAX
byte (lihat getconf ARG_MAX
di shell), panggilan ke execve()
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 bawaan bash
, gunakan mis
enable -n printf
Ada daftar pendek utilitas yang perlu dibangun ke dalam shell (diambil dari daftar standar built-in khusus POSIX )
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
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 cd
memengaruhi lingkungan eksekusi shell saat ini, selalu disediakan sebagai built-in shell biasa. Jika dipanggil dalam subkulit atau lingkungan eksekusi utilitas terpisah, seperti salah satu dari yang berikut:
(cd /tmp)
nohup cd
find . -exec cd {} \;
itu tidak mempengaruhi direktori kerja dari lingkungan pemanggil.
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).