2011-08-19 36 views
62

Trên Linux (Ubuntu 11.04) trong bash, có thể tạm thời đặt biến môi trường sẽ chỉ khác với biến bình thường trong suốt thời gian của tập lệnh không? Ví dụ, trong một kịch bản lệnh shell, tạo một ứng dụng lưu vào HOME portable bằng cách tạm thời đặt HOME thành một thư mục trong thư mục làm việc hiện tại, và sau đó khởi chạy ứng dụng.Làm thế nào để đặt biến môi trường chỉ trong khoảng thời gian của tập lệnh?

+4

Sẽ khó khăn hơn nếu bạn muốn cài đặt để kéo dài _beyond_ thời gian của kịch bản – Nemo

Trả lời

15

Chỉ cần đặt

export HOME=/blah/whatever 

tại điểm trong kịch bản mà bạn muốn thay đổi xảy ra. Vì mỗi tiến trình có bộ biến môi trường của riêng mình, định nghĩa này sẽ tự động dừng lại để có bất kỳ ý nghĩa nào khi kịch bản chấm dứt (và với nó là thể hiện của bash có môi trường thay đổi).

+3

Đó là sai lầm. 'export' sẽ chuyển biến thành subshells, nhưng nó không kiểm soát shell cha. Nếu bạn đang viết một tập lệnh bắt đầu bằng "#!/Bin/sh" hoặc tương tự, bất kỳ biến nào bạn đặt sẽ biến mất khi tập lệnh thoát. – brightlancer

+0

@brightlancer, điều đó đúng nhưng dường như không mâu thuẫn với bất cứ điều gì tôi viết. (Ngoại trừ khả năng kịch bản có thể bắt đầu một quá trình nền, nhưng tôi nghĩ rằng đó là vượt quá mức độ tinh tế của OP và sẽ chỉ gây nhầm lẫn). –

+3

Xuất không cần thiết. Ngoài ra, câu trả lời của bạn chỉ hoạt động nếu kịch bản lệnh gọi một trình thông dịch (#!/Bin/sh hoặc tương tự). Nếu "kịch bản" của anh ấy không có, thì những gì bạn vừa nói với anh ta sẽ tiếp tục tồn tại sau khi kết thúc kịch bản của anh ấy. Đó là lý do tại sao tôi nói câu trả lời của bạn gây hiểu lầm - nó có thể đúng, có thể không, nhưng chắc chắn có một phần không cần thiết và gây nhầm lẫn vì nó có thể khiến ai đó nghĩ rằng "xuất khẩu" là yếu tố cần thiết mà anh ta đang tìm kiếm. – brightlancer

50
env VAR=value myScript args ... 
+13

Hoặc 'VAR = giá trị myScript args ...' – Rockallite

+4

1. Làm thế nào đến 'PATH = $ PATH: XYZ echo $ PATH | grep XYZ' không có bất kỳ đầu ra mặc dù? 2. Sự khác nhau giữa việc sử dụng và không sử dụng 'env' là gì? – qubodup

+9

vì vỏ mở rộng biến PATH ** trước khi thực hiện lệnh echo. Bạn cần phải trì hoãn việc mở rộng đó. Một cách: 'PATH = $ PATH: XYZ sh -c 'echo $ PATH' | grep XYZ' - dấu nháy đơn là chìa khóa ở đây –

53
VAR1=value1 VAR2=value2 myScript args ... 
+1

Tôi đã tự làm điều này nhiều lần để chạy 'vblank_mode = 0 glxgears'. Nó hoạt động, nhưng nó cũng nói 'vblank_mode = 0: lệnh không tìm thấy' sau khi chạy, trong khi việc thêm vào trước 'env' không gây ra điều này. [thử nghiệm ...] Rõ ràng zsh không thích nó (nhưng vẫn sử dụng nó một cách chính xác), nhưng bash là tốt với nó. Tôi đoán tôi sẽ đi với phương pháp 'env' từ bây giờ. –

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