Đây là một quy tắc "như thể".
Nói một cách đơn giản: Hành vi của shell khi người dùng thấy nó không nên thay đổi nếu việc triển khai quyết định tạo một lệnh bên ngoài tiêu chuẩn cũng có sẵn dưới dạng shell tích hợp.
Sự tương phản mà tôi đã thể hiện tại /unix//a/496291/5132 giữa các hành vi của (một mặt) các vỏ PD Korn, MirBSD Korn và Heirloom Bourne; (mặt khác) các vỏ đạn Z, 93 Korn, Bourne Again và Debian Almquist; và (trên bàn tay nắm chặt) vỏ Watanabe làm nổi bật điều này.
Đối với các shell không printf
được tích hợp sẵn, việc xóa /usr/bin
khỏi sẽ PATH
tạo ra một lệnh printf
ngừng hoạt động. Hành vi tuân thủ POSIX, được thể hiện bởi vỏ Watanabe trong chế độ tuân thủ của nó, gây ra kết quả tương tự. Hành vi của shell có tích printf
hợp sẵn như thể nó đang gọi một lệnh bên ngoài.
Trong khi đó hành vi của tất cả các shell không tuân thủ sẽ không thay đổi nếu /usr/bin
bị xóa khỏi PATH
và chúng không hoạt động như thể chúng đang gọi một lệnh bên ngoài.
Điều mà tiêu chuẩn đang cố gắng đảm bảo với bạn là các shell có thể tích hợp tất cả các loại lệnh bên ngoài thông thường (hoặc thực hiện chúng như các hàm shell riêng của nó) và bạn vẫn sẽ có hành vi tương tự từ các hàm dựng sẵn như bạn đã làm với các lệnh bên ngoài nếu bạn điều chỉnh PATH
để ngăn chặn các lệnh được tìm thấy. PATH
vẫn là công cụ của bạn để chọn và kiểm soát những lệnh bạn có thể gọi.
(Như đã giải thích tại /unix//a/448799/5132 , nhiều năm trước mọi người đã chọn tính cách của Unix bằng cách thay đổi những gì đang diễn ra PATH
.)
Người ta có thể thấy rằng làm cho lệnh luôn hoạt động bất kể nó có thể được tìm thấy trên PATH
thực tế là điểm tạo ra các lệnh bên ngoài thông thường được tích hợp. (Đó là lý do tại sao bộ công cụ nosh của tôi vừa đạt được một printenv
lệnh tích hợp trong phiên bản 1.38, trên thực tế. Mặc dù đây không phải là một trình bao.)
Nhưng tiêu chuẩn mang đến cho bạn sự đảm bảo rằng bạn sẽ thấy hành vi tương tự đối với các lệnh bên ngoài thông thường không có trên PATH
shell như bạn sẽ thấy từ các chương trình không phải shell khác gọi execvpe()
hàm và shell sẽ không thể thực hiện được chạy (dường như) các lệnh bên ngoài thông thường mà các chương trình khác không thể tìm thấy cùng PATH
. Mọi thứ hoạt động tự nhất quán theo quan điểm của người dùng và PATH
là công cụ để kiểm soát cách thức hoạt động của nó.
đọc thêm