Các biến môi trường toàn cục trong tập lệnh shell


83

Làm cách nào để đặt một biến môi trường toàn cục trong một tập lệnh bash?

Nếu tôi làm những thứ như

#!/bin/bash
FOO=bar

...hoặc là

#!/bin/bash
export FOO=bar

... các vars dường như vẫn ở trong ngữ cảnh cục bộ, trong khi tôi muốn tiếp tục sử dụng chúng sau khi tập lệnh kết thúc thực thi.

Câu trả lời:


141

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

. myscript.sh

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

export chi phối những 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 đó $BARsẽ có sẵn trong môi trường của runScript.sh, nhưng $FOOsẽ không.


27
Hãy cẩn thận với cái đầu tiên đó. Không có dấu gạch chéo, nó sẽ hiển thị trong đườ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 23/09/09

13
sourcelà một bí danh cho .. Vì vậy, bạn có thể chạy source myscript.shthay thế, nếu bạn muốn rõ ràng hơn.
Ehtesh Choudhury

Tôi đang tự hỏi điều gì sẽ xảy ra khi tôi chạy một tập lệnh có dấu chấm và dấu cách. thí dụ . myscript
cNgamba 09/09 '19

54

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

. ./setfoo.sh

Điều này thực thi nó trong ngữ cảnh của trình bao hiện tại , không phải dưới dạng trình bao phụ .

Từ trang người đàn ông bash:

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

Đọc và thực thi các lệnh từ tên tệp trong môi trường trình bao hiện tại 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 được tìm kiếm trong PATH không cần phải thực thi được. Khi bash không ở chế độ POSIX, thư mục hiện tại được tìm kiếm nếu không tìm thấy tệp nào trong PATH.

Nếu tùy chọn chuacepath cho lệnh nội trang shopt bị tắt, PATH sẽ 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 tham số vị trí khi tên tệp được thực thi.

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


Thật thú vị - Tôi chưa từng thấy cú pháp đó trước đây. Điều này có tương đương với nguồn ./setfoo.sh không?
ire_and_curses 23/09/09

2
Nó giống nhau, chỉ là nhanh hơn để nhập (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 23/09/09

9

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

Có thể 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ề cái gì source?
Phillip Cloud

Nhập @PhillipCloud man sourcevào thiết bị đầu cuối và bạn sẽ nhận được những gì mình muốn.
CDT

5
Tôi quen thuộc với source. Có lẽ OP không.
Phillip Cloud

2
@PhillipCloud Tôi muốn biết thêm thông tin chi tiết. 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ả những điều đó ... Thx!
Dan Rosenstark

4
#!/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 xuất cho các biến tương ứng với các tên được chỉ định, điều này sẽ khiến chúng nằm trong môi trường của các lệnh được thực thi sau đó. Nếu tên của một biến được theo sau bởi = word, thì giá trị của biến đó sẽ được đặt thành word.


Xin vui lòng, đối với mọi người mới bắt đầu tập lệnh shell: lưu ý rằng 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

-3
FOO=bar
export FOO

2
Điều này không hoạt động, nó không đặt biến môi trường cho tiến trình mẹ.
dreamlax 23/09/09

3
Chỉ tiến trình mẹ mới có thể đặt một biến môi trường cho tiến trình mẹ.
glenn jackman 23/09/09
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.