2011-12-22 30 views
28

Tôi muốn sử dụng một kịch bản lệnh shell mà tôi có thể gọi để thiết lập một số biến môi trường. Tuy nhiên, sau khi thực thi kịch bản, tôi không thấy biến môi trường sử dụng "printenv" trong bash.Thiết lập biến môi trường trong kịch bản lệnh shell không làm cho nó hiển thị đối với shell

Đây là kịch bản của tôi:

#!/bin/bash 

echo "Hello!" 
export MYVAR=boubou 
echo "After setting MYVAR!" 

Khi tôi làm "./test.sh", tôi thấy:

Hello! 
After setting MYVAR! 

Khi tôi làm "myVar printenv", tôi thấy không có gì.

Bạn có thể cho tôi biết tôi đang làm gì sai không?

Trả lời

49

Đây là cách biến môi trường hoạt động. Mỗi quá trình đều có một bản sao của môi trường. Bất kỳ thay đổi nào mà quy trình làm cho bản sao của nó lan truyền cho trẻ em của quá trình. Họ không, tuy nhiên, tuyên truyền cho cha mẹ của quá trình.

Một cách để làm được việc này là bằng cách sử dụng lệnh source:

source ./test.sh 

hoặc

. ./test.sh 

(hai hình thức là đồng nghĩa).

Khi bạn thực hiện việc này, thay vì chạy tập lệnh trong một hệ vỏ con, bash sẽ thực thi từng lệnh trong tập lệnh như thể nó được nhập vào dấu nhắc.

+0

Nó hoạt động, nhưng tại sao "test.sh bash" không đặt biến môi trường? Nếu bash thực hiện mỗi lệnh trong kịch bản như thể nó được gõ vào dấu nhắc, biến môi trường sẽ được thiết lập trong tiến trình hiện tại? – GDICommander

+2

@GDICommander: Không. Khi bạn chạy 'bash test.sh', điều này tạo ra một quá trình' bash' mới thực hiện kịch bản ** và thoát **. – NPE

+1

Ok, cảm ơn thông tin. Bây giờ, tôi hiểu các biến môi trường tốt hơn một chút. – GDICommander

3

Một giải pháp thay thế khác là có tập lệnh in các biến bạn muốn đặt, với echo export VAR=value và làm eval "$(./test.sh)" trong trình bao chính của bạn. Đây là phương pháp được sử dụng bởi các chương trình khác nhau [ví dụ: thay đổi kích thước, dircolors] cung cấp các biến môi trường để thiết lập.

này chỉ hoạt động nếu kịch bản không có đầu ra khác (hoặc nếu có đầu ra khác xuất hiện trên stderr, với >&2)

+0

Tại sao downvote? Đây là một mô hình phổ biến và có một số lợi thế. – Random832

+0

Điều này không hiệu quả đối với tôi. Lấy làm tiếc. – FractalSpace

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