Đưa ra lệnh trong ví dụ của bạn, echo
sẽ chạy, nhưng những gì xảy ra $APPLE
thì phức tạp hơn một chút.
Điều này đúng, như được chỉ ra trong câu trả lời của @ Patrick ở đây, rằng nếu shell gọi một quy trình thì tất cả các biến được khai báo trên dòng lệnh trước lệnh gọi của nó được chỉ định sẽ được xuất vào môi trường của nó. Và hơn nữa, các biến đó cũng được chỉ định hết hạn với quy trình được gọi - vì vậy ...
unset var; var=val cmd; echo ${var-unset.}
... nên in unset.
Nhưng nơi toàn bộ khái niệm này được một chút phức tạp hơn mặc dù, và như ví dụ của riêng bạn cho thấy, là tại thời điểm đó cmd
là không một quá trình Viện dẫn nhưng thay vào đó hoặc là một vỏ dựng sẵn, một chức năng vỏ, hoặc một đặc biệt vỏ được xây dựng trong tiện ích. Trong mỗi một trong ba trường hợp đó, shell rất có thể sẽ chỉ chạy một số thói quen của riêng nó trong bộ nhớ, và không gọi được gì cả.
Ví dụ, echo
là gần như chắc chắn một lớp vỏ được xây dựng trong tiện ích - như hầu hết các vỏ tôi biết cung cấp cho nó như vậy - nhưng nó là không một POSIX chỉ định đặc biệt được xây dựng trong. Theo cách này, về cơ bản, nó là một hàm shell phải mô phỏng một thực thi bên ngoài. Điều này có lẽ được nêu rõ hơn một chút ở đây:
Thuật ngữ "tích hợp" ngụ ý rằng trình bao có thể thực thi trực tiếp tiện ích và không cần tìm kiếm nó. Việc triển khai có thể chọn làm cho bất kỳ tiện ích nào được tích hợp sẵn; tuy nhiên, các tiện ích tích hợp đặc biệt được mô tả ở đây khác với các tiện ích tích hợp thông thường ...
Các bài tập biến được chỉ định với các tiện ích tích hợp đặc biệt vẫn có hiệu lực sau khi hoàn thành tích hợp; điều này sẽ không xảy ra với một tiện ích tích hợp thông thường hoặc tiện ích khác.
Các tiện ích tích hợp đặc biệt trong phần này không cần phải được cung cấp theo cách có thể truy cập thông qua họ hàm thực thi được xác định trong khối Giao diện hệ thống của POSIX.1-2008.
Vì vậy, một biến được khai báo trên echo
dòng lệnh bị diệt echo
, nhưng một biến được khai báo trên set
dòng lệnh vẫn tồn tại - (mặc dù bash
theo mặc định vi phạm quy tắc này) . Điều tương tự cũng đúng khi cmd
là hàm shell :
Khi một hàm được thực thi, nó sẽ có các thuộc tính lỗi cú pháp và gán biến được mô tả cho các tiện ích tích hợp đặc biệt trong danh sách liệt kê ở đầu Tiện ích tích hợp đặc biệt.
sh
phải tuân thủ tiêu chuẩn, nhưng nó không chỉ định đường dẫn nàosh
phải có nên/bin/sh
không nhất thiết phải là vỏ POSIX và thực sự là vỏ Bourne kế thừa trên một số nền tảng (hiện tại là Solaris 10 trở lên). Điều này sẽ không bị tổn thương trong trường hợp gán biến cụ thể này vì cú pháp này dài trước tiêu chuẩn POSIX.