Các lệnh được tích hợp vào shell thường được tích hợp do tăng hiệu năng mà điều này mang lại. Gọi bên ngoài printf
, ví dụ, chậm hơn so với sử dụng tích hợp printf
.
Vì một số tiện ích không cần phải được xây dựng, trừ khi chúng đặc biệt, như thế cd
, chúng cũng được cung cấp dưới dạng tiện ích bên ngoài . Điều này là để các tập lệnh sẽ không bị hỏng nếu chúng được giải thích bởi một trình bao không cung cấp tương đương.
Một số phần mềm tích hợp của shell cũng cung cấp các phần mở rộng cho lệnh tương đương bên ngoài. Bash printf
, ví dụ là có thể làm
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
(in ra một biến) mà bên ngoài /usr/bin/printf
đơn giản là không thể thực hiện được vì nó không có quyền truy cập vào các biến shell trong phiên shell hiện tại (và không thể thay đổi chúng).
Các tiện ích được tích hợp cũng không có hạn chế là dòng lệnh mở rộng của chúng phải ngắn hơn một độ dài nhất định. Đang làm
printf '%s\n' *
do đó là an toàn nếu printf
là một lệnh tích hợp shell. Hạn chế về độ dài của dòng lệnh xuất phát từ execve()
chức năng thư viện C được sử dụng để thực thi lệnh bên ngoài. Nếu dòng lệnh và môi trường hiện tại lớn hơn ARG_MAX
byte (xem getconf ARG_MAX
trong shell), lệnh gọi execve()
sẽ thất bại. Nếu tiện ích được tích hợp vào shell, execve()
thì không cần phải gọi.
Được xây dựng trong các tiện ích được ưu tiên hơn các tiện ích được tìm thấy trong $PATH
. Để tắt lệnh tích hợp sẵn bash
, hãy sử dụng, vd
enable -n printf
Có một danh sách ngắn các tiện ích cần được tích hợp vào vỏ (lấy từ danh sách tích hợp đặc biệt của tiêu chuẩn POSIX )
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
Chúng cần được xây dựng vì chúng trực tiếp thao tác với môi trường và luồng chương trình của phiên shell hiện tại. Một tiện ích bên ngoài sẽ không thể làm điều đó.
Thật thú vị, cd
không phải là một phần của danh sách này, nhưng POSIX nói như sau về điều đó:
Vì cd
ảnh hưởng đến môi trường thực thi shell hiện tại, nó luôn được cung cấp dưới dạng shell được tích hợp thường xuyên. Nếu nó được gọi trong một môi trường con hoặc môi trường thực thi tiện ích riêng biệt, chẳng hạn như một trong những điều sau đây:
(cd /tmp)
nohup cd
find . -exec cd {} \;
nó không ảnh hưởng đến thư mục làm việc của môi trường người gọi.
Do đó, tôi cho rằng các tích hợp "đặc biệt" không thể có các đối tác bên ngoài, trong khi cd
về lý thuyết có thể có (nhưng nó sẽ không làm được gì nhiều).