2012-02-17 25 views
58

Tôi đã nhìn thấy kịch bản shell mà bao gồm một dòng như:Điều gì xảy ra khi một tệp là `source`-d trong bối cảnh Unix/Linux?

source someOtherFile 

Tôi biết rằng sẽ làm cho nội dung của someOtherFile để thực hiện, nhưng tầm quan trọng của source là gì?


Câu hỏi tiếp theo: Có thể có mã nguồn hoặc chỉ một số loại tập lệnh nhất định không? Có bất kỳ tác dụng phụ nào khác ngoài các biến môi trường khi một tập lệnh có nguồn gốc (trái ngược với việc thực thi thông thường nó) không?

+2

trùng lặp trang web chéo: http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash-scrip/176788#176788 – lesmana

Trả lời

67

Chạy lệnh source trên tập lệnh thực thi tập lệnh trong ngữ cảnh của quy trình hiện tại. Điều này có nghĩa là các biến môi trường do kịch bản thiết lập vẫn có sẵn sau khi nó chạy xong. Điều này trái ngược với việc chạy một kịch bản thông thường, trong đó các biến môi trường trường hợp được đặt trong quy trình mới được sinh ra sẽ bị mất sau khi tập lệnh thoát.

Bạn có thể mã nguồn bất kỳ tập lệnh shell nào có thể chạy được. Hiệu ứng cuối cùng sẽ giống như khi bạn gõ các lệnh trong kịch bản lệnh vào terminal của bạn. Ví dụ, nếu kịch bản thay đổi thư mục, khi nó kết thúc chạy, thư mục làm việc hiện tại của bạn sẽ thay đổi.

+2

Có thể lấy bất kỳ tập lệnh BẤT CỨ nào hoặc chỉ một số loại tập lệnh nhất định không? Bất kỳ tác dụng phụ nào khác ngoài các biến môi trường khi một tập lệnh có nguồn gốc (trái ngược với việc thực thi thông thường nó)? Ngoài ra, câu trả lời của bạn ngắn gọn và dễ hiểu. Cảm ơn! –

+4

Bạn có thể mã nguồn bất kỳ tập lệnh shell nào. Tác dụng phụ được tạo ra bởi thực tế là kịch bản là nghĩa đen chạy trong quá trình của bạn. Vì vậy, nếu nó thay đổi thư mục, bạn sẽ thấy thay đổi pwd của bạn. Trong khi đó, việc thực thi một kịch bản lệnh shell thông thường sẽ không thay đổi pwd của bạn. – Interrobang

+0

Điều gì về tôi có một kịch bản chạy dài bên trong tập tin vào nguồn? nó sẽ kết thúc? hoặc là có một thời gian chờ mặc định của nó.? –

16

Nếu bạn thông báo cho trình bao, ví dụ: bash, để đọc một tập tin và thực hiện các lệnh trong tập tin, nó được gọi là tìm nguồn cung ứng. Điểm chính là, quá trình hiện tại (shell) thực hiện điều này, không phải là một tiến trình con mới.

Trong BASH bạn có thể sử dụng lệnh source hoặc chỉ cần . để nguồn tệp.

2

source là lệnh Unix đánh giá tệp theo lệnh, dưới dạng danh sách lệnh, được thực hiện trong ngữ cảnh hiện tại. Bạn cũng có thể sử dụng . để tìm nguồn cung cấp tệp.

source my-script.sh; 
. my-script.sh; 

Cả hai lệnh sẽ có cùng tác dụng.

Ngược lại, chuyển tên tập lệnh vào vỏ mong muốn sẽ chạy tập lệnh trong một vỏ con chứ không phải ngữ cảnh hiện tại.

Các vấn đề liên quan