Các tập lệnh Shell thường được xử lý như thể chúng giống như bất kỳ loại tập tin thực thi nào khác, chẳng hạn như tệp nhị phân, tập lệnh Python, tập lệnh Perl hoặc bất kỳ loại tập lệnh nào khác. Họ có một shebang ở đầu chỉ đạo kernel thực thi chúng thông qua shell. Chúng được dự kiến sẽ được gọi giống như bất kỳ lệnh nào khác.
Như vậy, một shell mới được khởi động mỗi khi script được gọi và bất kỳ cài đặt nào như set -f
hiện diện trong shell gọi hoặc trong bất kỳ trường hợp shell nào khác trong hệ thống đều không liên quan.
Tất nhiên, người dùng có thể lấy tập lệnh của bạn thay vì chạy tập lệnh, ví dụ như thế này:
. /path/to/your/script
hoặc để thực thi nó trong trình bao có các cài đặt không mặc định như thế này:
sh -f /path/to/your/script
nhưng những cách đó không được coi là cách thông thường hoặc gọi kịch bản của bạn và những người dùng làm điều đó sẽ mong đợi bất cứ điều gì họ nhận được như là kết quả.
Lưu ý rằng có một số tập lệnh được dự định có nguồn gốc, không được thực thi, vì mục đích của chúng là nhằm thay đổi cwd hoặc đặt các biến môi trường phải được phản ánh trong môi trường của vỏ tìm nguồn, nhưng chúng là thiểu số và nó thường được thực hiện như một phần của giao thức đã thỏa thuận. Các tệp này có thể được coi là giống như "bổ trợ" cho bất kỳ hệ thống nào mà chúng mong đợi có nguồn gốc, không nhiều như các tập lệnh độc lập. Ví dụ: các tệp /etc/rc*.d
có tên kết thúc .sh
được lấy từ hệ thống con tập lệnh khởi động, không được thực thi và được ghi lại rằng đây là điều sẽ xảy ra nếu bạn đặt một tệp có tên như vậy vào/etc/rc*.d
và khi nó được thực hiện nó có mục đích. Quy ước đặt tên các tệp dự định có nguồn gốc thay vì được thực hiện theo cách này cũng được tuân theo ở nơi khác, nhưng không phổ biến.
Đúng là các tệp dự định có nguồn gốc theo cách này phải quan tâm đến những cài đặt nào có thể có trong môi trường trình gọi của chúng có thể ảnh hưởng đến hành vi của trình bao, nhưng sau đó, giao thức đã thỏa thuận sẽ hứa hẹn một môi trường thực thi có thể dự đoán được.
shell_state=$(set +o)
... kịch bản ...eval "$shell_state"