Hãy nghĩ về lệnh 'nguồn' như trong câu lệnh 'bao gồm'. Nó lấy nội dung của đối số và chạy nó như thể nó được chạy trực tiếp. Trong trường hợp này, lệnh của bạn là 'nguồn' với đối số 'run.sh' và run.sh được thực thi chính xác như thể bạn đã nhập nội dung của run.sh vào dòng lệnh của mình.
Khi bạn chạy './run.sh', './run.sh' là lệnh của bạn và nó không có đối số. Vì tệp này là văn bản thuần túy và không phải là nhị phân, trình bao của bạn tìm kiếm một trình thông dịch tại shebang ('#!' Trên dòng đầu tiên) và tìm thấy '/ bin / bash'. Vì vậy, shell của bạn sau đó bắt đầu một phiên bản bash mới và nội dung của run.sh được chạy bên trong thể hiện mới này.
Trong trường hợp đầu tiên, khi bash đạt đến lệnh 'exit', nó được thực thi chính xác như thể bạn đã gõ nó vào dòng lệnh. Trong các trường hợp thứ hai, nó được thực thi trong quá trình bash shell của bạn bắt đầu, do đó chỉ có trường hợp bash này nhận được lệnh 'exit'.
Khi bạn nhập một dòng vào bash, bất cứ điều gì trước dấu cách đầu tiên được coi là một lệnh và bất cứ điều gì tiếp theo đều được coi là đối số. Lệnh '.' là một bí danh của 'nguồn'. Khi bạn chạy '. chạy.sh 'cái'. ' là một lệnh riêng của nó vì nó được phân tách khỏi các đối số của nó bằng một khoảng trắng. Khi bạn chạy './run.sh', lệnh của bạn là './run.sh' và '.' là một phần của đường dẫn tương đối đến run.sh với '.' đại diện cho thư mục hiện tại của bạn.
$- = *i*
hoạt động?