Câu hỏi Biến môi trường toàn cầu trong một kịch bản lệnh shell


Làm thế nào để thiết lập một biến môi trường toàn cầu trong một kịch bản bash?

Nếu tôi làm những việc như

#!/bin/bash
FOO=bar

...hoặc là

#!/bin/bash
export FOO=bar

... các vars dường như ở lại trong bối cảnh địa phương, trong khi tôi muốn tiếp tục sử dụng chúng sau khi kịch bản đã hoàn thành thực hiện.


76
2017-09-23 06:25


gốc




Các câu trả lời:


Chạy tập lệnh của bạn với . 

. myscript.sh

Thao tác này sẽ chạy tập lệnh trong môi trường trình bao hiện tại.

export điều chỉnh các biến nào sẽ có sẵn cho các quy trình mới, vì vậy nếu bạn nói

FOO=1
export BAR=2
./runScript.sh

sau đó $BAR sẽ có sẵn trong môi trường runScript.sh, nhưng $FOO sẽ không.


124
2017-09-23 06:28



Hãy cẩn thận với cái đầu tiên. Nếu không có dấu gạch chéo, nó sẽ nhìn vào đường dẫn của bạn: sử dụng một cái gì đó như '. ./myscript.sh 'nếu bạn muốn đảm bảo nó chạy một cái cụ thể. - paxdiablo
source là bí danh cho .. Vì vậy, bạn có thể chạy source myscript.sh thay vào đó, nếu bạn muốn rõ ràng hơn. - Ehtesh Choudhury


Khi bạn chạy một kịch bản shell, nó được thực hiện trong một sub-shell, do đó nó không thể ảnh hưởng đến môi trường của shell cha. Bạn muốn nguồn tập lệnh bằng cách thực hiện:

. ./setfoo.sh

Điều này thực hiện nó trong bối cảnh của hiện hành vỏ, không phải là một phụ vỏ.

Từ trang bash man:

. tên tệp [đối số]
tên tệp nguồn [đối số]

Đọc và thực hiện các lệnh từ tên tệp trong trình bao hiện tại   môi trường và trả về trạng thái thoát của lệnh cuối cùng được thực thi   từ tên tệp.

Nếu tên tệp không chứa dấu gạch chéo, tên tệp trong PATH được sử dụng để   tìm thư mục chứa tên tệp.

Tệp tìm kiếm trong PATH không cần thực thi. Khi bash không   trong chế độ POSIX, thư mục hiện tại được tìm kiếm nếu không tìm thấy tệp   trong PATH.

Nếu tùy chọn sourcepath đến lệnh nội trang shopt bị tắt,   PATH không được tìm kiếm.

Nếu bất kỳ đối số nào được cung cấp, chúng sẽ trở thành các tham số vị trí   khi tên tệp được thực hiện.

Nếu không, các tham số vị trí sẽ không thay đổi. Trạng thái trả về   là trạng thái của lệnh cuối cùng đã thoát trong kịch bản (0 nếu không có   lệnh được thực thi) và sai nếu tên tệp không được tìm thấy hoặc không thể   được đọc.


47
2017-09-23 06:29



Thú vị - Tôi chưa từng thấy cú pháp đó trước đây. Điều này tương đương với nguồn ./setfoo.sh? - ire_and_curses
Nó giống nhau, chỉ cần gõ nhanh hơn (và tương thích hơn trên các hệ thống cũ hơn - ksh không có lệnh nguồn nhưng nó có '.'). - paxdiablo


source myscript.sh cũng khả thi.

Mô tả cho lệnh linux source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context

6
2017-09-01 00:48



Có lẽ chỉ là một chút chi tiết ở đây. Làm thế nào về một mô tả rất ngắn gọn về những gì source làm? - Phillip Cloud
Loại @PhillipCloud man source trong nhà ga và bạn sẽ có được những gì bạn muốn. - CDT
Tôi quen thuộc với source. Có lẽ OP không phải. - Phillip Cloud
@PhillipCloud Tôi muốn một số chi tiết hơn, bản thân mình. Nếu bạn muốn chỉnh sửa câu trả lời, bạn chắc chắn có thể làm điều đó. Giúp nguyên nhân và tất cả ... Thx! - Dan Rosenstark


#!/bin/bash
export FOO=bar

hoặc là

#!/bin/bash
FOO=bar
export FOO

người đàn ông xuất khẩu:

Shell sẽ cung cấp thuộc tính export cho các biến tương ứng với các tên được chỉ định, sẽ làm cho chúng nằm trong môi trường của các lệnh được thực hiện sau đó. Nếu tên của biến được theo sau bởi = word, thì giá trị của biến đó sẽ được đặt thành từ.


4
2017-09-23 06:33



Xin vui lòng, với mọi người mới bắt đầu trong kịch bản lệnh shell: lưu ý không có bất kỳ khoảng trắng nào giữa tên envvar, ký tự '=' và giá trị của chính nó; điều này sẽ không hoạt động: export FOO = /mydir/bar - russellhoff


FOO=bar
export FOO

-3
2017-09-23 06:27



Điều này không làm việc, nó không đặt biến môi trường cho quá trình cha mẹ. - dreamlax
Chỉ có tiến trình cha mẹ mới có thể thiết lập một biến môi trường cho tiến trình cha mẹ. - glenn jackman