Các bash-buildin 'set' và 'export' làm gì?


46

Tôi có một chút mất mát về mục đích setexporttrong Bash (và tôi đoán có lẽ các vỏ khác cũng vậy).

Tôi sẽ nghĩ rằng nó là để thiết lập các biến môi trường, nhưng điều đó có thể được thực hiện chỉ với VARIABLE=VALUE, phải không?

Cũng gõ setexporttrên riêng của họ hiển thị các giá trị khác nhau.

Vậy mục đích của họ là gì?



Tôi luôn bắt đầu bằng bash script với hai phần sau. #! / usr / bin / env bash set -euxo pipefail Liên kết này giải thích rất hay. coderwall.com/p/fkfaqq/ cường
147.3k

Câu trả lời:


50

exportxuất khẩu cho trẻ em của quy trình hiện tại, theo mặc định chúng không được xuất khẩu. Ví dụ:

$ foo=bar
$ echo "$foo"
bar
$ bash -c 'echo "$foo"'

$ export foo
$ bash -c 'echo "$foo"'
bar

setmặt khác, đặt các thuộc tính shell, ví dụ, các tham số vị trí.

$ set foo=baz
$ echo "$1"
foo=baz

Lưu ý rằng bazkhông được gán cho foo, nó chỉ đơn giản trở thành một tham số vị trí theo nghĩa đen. Có nhiều thứ khác setcó thể làm (chủ yếu là tùy chọn shell), xem help set.

Đối với in, exportđược gọi không có đối số sẽ in tất cả các biến trong môi trường của shell. setcũng in các biến không được xuất. Nó cũng có thể xuất một số đối tượng khác (mặc dù bạn cần lưu ý rằng đây không phải là di động), xem help export.


Cảm ơn đó là một câu trả lời rất hữu ích. Tuy nhiên, khi tôi đặt http_proxy chỉ với http_proxy = abc.com , nó sẽ hiển thị cho các tiến trình con, ví dụ: chạy wget mà không cần tôi xuất nó. Làm sao có thể?
mydoghasworms

2
@mydoghasworms Hai lý do có thể. Một, bạn đang chạy lệnh như foo=bar command. Đây là một xuất khẩu ngầm cho một lệnh duy nhất. Khả năng thứ hai http_proxylà đã được xuất trong môi trường của bạn trước khi bạn sửa đổi nó.
Chris Down

À đúng rồi, bạn đúng. Rực rỡ, cảm ơn!
mydoghasworms

6

Xem help set: set được sử dụng để đặt thuộc tính shell và thuộc tính vị trí.

Các biến không được xuất không được kế thừa bởi các tiến trình con. exportđược sử dụng để đánh dấu một biến để xuất khẩu.

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.