Sự khác biệt giữa xuất khẩu a = b và xuất khẩu a = bv trong bash


50

Sự khác biệt giữa:

a=b

export a=b

Trong bash?

Tôi hiểu rằng cả hai đều xác định các biến môi trường, nhưng tôi không hiểu đầy đủ về sự khác biệt.


Ai đó có thể xin vui lòng chỉnh sửa này? Điều này hoàn toàn không liên quan đến Linux, mà chỉ phụ thuộc vào trình bao bạn đang sử dụng. Tôi đoán nó bash ở đây, cũng hoạt động trên Windows.
innaM

Tôi đứng sửa.
Adam Matan

Câu trả lời:


54

export tuyên truyền biến cho các quy trình con.

Ví dụ, nếu bạn đã làm

FOO=bar

sau đó một quy trình con đã kiểm tra FOO sẽ không tìm thấy biến trong khi

export FOO=bar

sẽ cho phép các quy trình con tìm thấy nó.

Nhưng nếu FOOđã đã được định nghĩa là một biến môi trường, sau đó FOO=barsẽ thay đổi giá trị của điều đó biến môi trường.

Ví dụ:

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

Các shell cũ hơn không hỗ trợ export FOO=barcú pháp; bạn phải ghi FOO=bar; export FOO.


33
Thực tế, nếu bạn không sử dụng " export", bạn không xác định biến môi trường, mà chỉ là biến vỏ. Biến Shell chỉ có sẵn cho quá trình shell; biến môi trường có sẵn cho bất kỳ quá trình tiếp theo, không chỉ vỏ. Ngoài ra, các lớp con là các lệnh được chứa trong dấu ngoặc đơn, chúng có quyền truy cập vào các biến shell, trong khi những gì bạn đang nói đến là các tiến trình con xảy ra là các shell.
wfaulk

Những thứ này được lưu trữ ở đâu?
HDave

28

Nếu bạn không sử dụng export, bạn không xác định biến môi trường; chỉ là một biến vỏ.

Biến Shell chỉ có sẵn cho quá trình shell; biến môi trường có sẵn cho bất kỳ quá trình tiếp theo, không chỉ vỏ.


2

Ngoài ra, nếu bạn muốn có sẵn biến cho vỏ gọi mà không cần xuất, bạn có thể thực hiện việc này:

Tệp a.ksh là -

#!/bin/ksh
FOO=bar

Trên dấu nhắc, chạy này là

> . a.ksh

Điều này sẽ chạy các lệnh trong cùng một shell và $ FOO sẽ có sẵn.

Trong khi,

> a.ksh

Sẽ cung cấp $ FOO chỉ trong phạm vi a.ksh, sau khi gọi đến a.ksh, nó sẽ không tồn tại.


1
Chính xác. Lưu ý rằng "." chỉ là một phím tắt cho "nguồn", đôi khi được sử dụng trong các tập lệnh để dễ đọc hơn. Xem "giúp đỡ." hoặc "nguồn trợ giúp" để biết chi tiết.
sleske

1

Ngoài những gì đã được trả lời, cả hai câu lệnh này không nhất thiết phải định nghĩa (tức là tạo vs bộ) một biến môi trường là "a" có thể đã tồn tại dưới dạng biến vỏ hoặc biến môi trường.

Trong trường hợp sau, cả hai câu lệnh đều tương đương nhau.

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.