Các biến và hàm nằm trong các không gian tên khác nhau trong dấu gạch ngang và điều này cũng được chỉ định bởi POSIX :
Việc thực hiện sẽ duy trì các không gian tên riêng cho các hàm và biến.
Thêm vào đó, các biến có phạm vi toàn cầu, theo mặc định. Một số shell (ví dụ bash, ksh và zsh) cung cấp local
từ khóa để khai báo các biến trong một hàm chỉ có phạm vi cục bộ.
Vì vậy, vâng, hành vi bạn đang thấy được đảm bảo bởi POSIX.
POSIX chưa được chuẩn hóa local
, nhưng :
Việc mô tả các hàm trong một đề xuất ban đầu được dựa trên khái niệm rằng các hàm sẽ hoạt động giống như các tập lệnh shell thu nhỏ; nghĩa là, ngoại trừ việc chia sẻ các biến , hầu hết các thành phần của môi trường thực thi sẽ hoạt động như thể chúng là môi trường thực thi mới, [..]
[..] Các biến cục bộ trong một hàm đã được xem xét và đưa vào một đề xuất ban đầu khác (được điều khiển bởi tích hợp đặc biệt local
), nhưng đã bị xóa vì chúng không phù hợp với mô hình đơn giản được phát triển cho các hàm và vì có một số ý kiến phản đối một tính năng đặc biệt mới khác không phải là một phần của thực tiễn lịch sử. Việc triển khai nên bảo lưu mã định danh local
(cũng như typeset
, được sử dụng trong KornShell) trong trường hợp cơ chế biến cục bộ này được áp dụng trong phiên bản tương lai của tiêu chuẩn này.
(nhấn mạnh của tôi)
fn
hàm nằm trong một không gian tên riêng biệt; nếu thực hiện nó một lần đã xóa sạch định nghĩa của nó, chúng ta sẽ thấy chính xác hành vi tương tự. Bạn sẽ chỉ ra rằng hàm vẫn được xác định, ví dụ nhưtype fn
sau đó.