Eliah đã làm rất tốt khi trả lời điều này, nhưng tôi muốn bình luận về phần "tại sao lại có một phiên bản khác echo
tách biệt với chương trình Bash". Đó là câu hỏi sai.
Câu hỏi đúng là: tại sao đây là một dựng sẵn ở nơi đầu tiên , khi nó có thể là (và là) một lệnh bên ngoài hoàn toàn tốt?
Để đơn giản, hãy xem các nội trang trong dấu gạch ngang, một con số 38 (bash có 61, để so sánh, đi theo đầu ra của 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
Có bao nhiêu trong số này cần phải được xây dựng? [
, echo
, false
, printf
, pwd
, test
, Và true
không cần phải dựng sẵn: Họ không làm gì cả mà chỉ có một dựng sẵn có thể làm (ảnh hưởng hoặc có được trạng thái vỏ đó là không có sẵn cho các lệnh bên ngoài). Bash's printf
ít nhất tận dụng lợi thế của một tích hợp: printf -v var
lưu đầu ra vào biến var
. time
trong bash cũng đặc biệt: bằng cách là một từ khóa, bạn có thể liệt kê các danh sách lệnh tùy ý trong bash (dấu gạch ngang không có time
tương đương). pwd
cũng không cần phải là một nội dung - bất kỳ lệnh bên ngoài nào cũng sẽ kế thừa thư mục làm việc hiện tại (và đó cũng là một lệnh bên ngoài ).:
là một ngoại lệ - bạn cần một NOP, và :
nó là như vậy. Phần còn lại thực hiện các hành động mà một lệnh bên ngoài có thể dễ dàng thực hiện.
Vì vậy, một phần năm trong số các bản dựng này không cần phải là bản dựng. Tại sao, sau đó? Các dash
manpage * thực sự giải thích trong đi qua tại sao đây là lệnh nội trú (tôi nhấn mạnh):
Nội địa
Phần này liệt kê các lệnh dựng sẵn được xây dựng bởi vì chúng
cần thực hiện một số thao tác không thể được thực hiện bởi một riêng
quá trình. Ngoài những thứ này, có một số lệnh khác có thể
được xây dựng cho hiệu quả (ví dụ printf (1), echo (1), test (1), v.v.).
Đó là khá nhiều: các nội dung này có ở đó bởi vì chúng được sử dụng thường xuyên, tương tác và trong các tập lệnh, và chức năng của chúng đủ đơn giản, để trình bao có thể thực hiện công việc. Và như vậy nó sẽ xảy ra: một số (? Nhất) vỏ mất trong công việc ** Quay trở lại. Cácsh
từ 2,9 BSD , và bạn sẽ không tìm thấy một echo
dựng sẵn.
Vì vậy, hoàn toàn có khả năng một shell tối thiểu có thể bỏ qua việc thực hiện các lệnh như nội dung (tuy nhiên tôi không nghĩ rằng bất kỳ shell hiện tại nào cũng vậy). Dự án coreutils GNU không cho rằng bạn sẽ chạy chúng trong một trình bao cụ thể và POSIX yêu cầu các lệnh này. Vì vậy, coreutils cung cấp những thứ này dù sao đi nữa, và bỏ qua những thứ không có ý nghĩa gì ngoài vỏ.
* Điều này gần giống với văn bản trang chủ tương ứng cho trình bao Almquist , đó là những gì dấu gạch ngang, trình bao của Debian Almquist, dựa trên.
** zsh
đưa ý tưởng này đến mức cực đoan: các lệnh bạn nhận được bằng cách tải các mô-đun khác nhau, như zmv
, là những thứ bạn không nghĩ rằng cần phải có vỏ . Tại thời điểm đó, câu hỏi thực sự là: tại sao bạn sẽ sử dụng bash thay vì zsh, nơi có tất cả các nội dung này?