Lệnh 'export' làm gì?


85

Tôi là một người mới làm quen với Linux, và tôi tình cờ chạy một số lệnh một cách mù quáng, để hoàn thành công việc. Tôi nghĩ rằng sẽ không lãng phí khi hỏi những câu hỏi kiểu này, vì nhiều người mới sẽ có kiến ​​thức thường xuyên về chúng.

Tôi bắt đầu làm việc với Jenkins gần đây, và sau đó tôi phải sử dụng exportlệnh này để chạy kho lưu trữ chiến tranh Jenkins . Vì vậy, tôi cần biết exportlệnh nói chung làm gì và tại sao chúng ta cần chạy lệnh này, trong khi chạy Jenkins (sau khi nhà Jenkins được thiết lập).

Cảm ơn!


1
Sẽ hữu ích nếu bạn nói thêm về lệnh xuất mà bạn đã sử dụng. Nếu không có thêm ngữ cảnh, tôi sẽ đoán rằng bạn đang đặt một biến môi trường. Xem en.wikipedia.org/wiki/Enosystem_variable#Unix
Joshua D. Boyd


có thể trùng lặp lệnh xuất unix
John Kugelman

Câu trả lời:


99

exporttrong shvà các trình bao liên quan (chẳng hạn như bash), đánh dấu một biến môi trường sẽ được xuất sang các quy trình con, để quy trình con kế thừa chúng.

exportđược định nghĩa trong POSIX :

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.


Cảm ơn rất nhiều! Tất cả các câu trả lời của bạn đều thực sự hữu ích và chúng cũng hướng dẫn bạn tìm hiểu thêm một số điều! :-)
Chathura Kulasinghe 10/12/12

1
Quá trình trẻ em theo nghĩa này là gì?
Zinan Xing

13
Không hiểu
Martin Hansen

@MartinHansen bạn không hiểu gì? ngoài ra, hãy xem câu trả lời của tôi.
barlop

Có một khung vuông phụ ở phần cuối của liên kết, tôi không thể chỉnh sửa nó, bởi vì nó là một biểu tượng chỉnh sửa :)
Radoslav Stoyanov

27

Tôi đoán bạn đang đến từ nền cửa sổ. Vì vậy, tôi sẽ đối chiếu chúng (tôi cũng là người mới làm quen với linux). Tôi tìm thấy câu trả lời của người dùng cho nhận xét của tôi, rất hữu ích trong việc tìm hiểu mọi thứ.

Trong Windows, một biến có thể là vĩnh viễn hoặc không. Thuật ngữ Biến môi trường bao gồm một biến được đặt trong trình bao cmd bằng lệnh SET, cũng như khi biến được đặt trong GUI cửa sổ, do đó được đặt trong sổ đăng ký và có thể xem được trong các cửa sổ cmd mới. ví dụ: tài liệu cho lệnh set trong windows https://technet.microsoft.com/en-us/library/bb490998.aspx "Hiển thị, đặt hoặc xóa các biến môi trường. Được sử dụng mà không có tham số, set hiển thị cài đặt môi trường hiện tại." Trong Linux, set không hiển thị các biến môi trường, nó hiển thị các biến shell mà nó không gọi / gọi là biến môi trường. Ngoài ra, Linux không sử dụng set để thiết lập các biến (ngoài các tham số vị trí và các tùy chọn shell, mà tôi giải thích ở phần cuối), chỉ để hiển thị chúng và thậm chí sau đó chỉ để hiển thị các biến shell. Windows sử dụng set để thiết lập và hiển thị, ví dụ set a = 5, linux thì không.

Trong Linux, tôi đoán bạn có thể tạo một tập lệnh đặt các biến khi khởi động, ví dụ /etc/profilehoặc /etc/.bashrcnhưng nếu không, chúng không vĩnh viễn. Chúng được lưu trữ trong RAM.

Trong Linux có sự phân biệt giữa các biến shell và các biến môi trường. Trong Linux, các biến shell chỉ nằm trong shell hiện tại và các biến Môi trường, nằm trong shell đó và tất cả các shell con.

Bạn có thể xem các biến shell bằng setlệnh (mặc dù lưu ý rằng không giống như windows, các biến không được đặt trong linux bằng lệnh set).

set -o posix; set (làm điều đó set -o posix một lần đầu tiên, giúp không hiển thị quá nhiều thứ không cần thiết). Vì vậy, sethiển thị các biến shell.

Bạn có thể xem các biến môi trường bằng envlệnh

các biến shell được đặt với ví dụ: just a = 5

biến môi trường được đặt với xuất, xuất cũng đặt biến shell

Ở đây bạn thấy biến shell được đặt zzz với zzz = 5 và nó hiển thị khi chạy setnhưng không hiển thị dưới dạng biến môi trường.

Ở đây chúng ta thấy yyy được đặt với export, vì vậy nó là một biến môi trường. Và xem nó hiển thị dưới cả biến shell và biến môi trường

$ zzz=5

$ set | grep zzz
zzz=5

$ env | grep zzz

$ export yyy=5

$ set | grep yyy
yyy=5

$ env | grep yyy
yyy=5

$

các chủ đề hữu ích khác

/unix/176001/how-can-i-list-all-shell-variables

/ubuntu/26318/enosystem-variable-vs-shell-variable-whats-the-difference

Lưu ý - một điểm mà nó xây dựng một chút và có phần sửa chữa những gì tôi đã viết, đó là, trong bash linux, 'set' có thể được sử dụng để đặt "tham số vị trí" và "tùy chọn / thuộc tính shell", và về mặt kỹ thuật cả hai đó là các biến, mặc dù các trang man có thể không mô tả chúng như vậy. Tuy nhiên, như đã đề cập, set sẽ không đặt các biến shell hoặc biến môi trường). Nếu bạn làm vậy set asdfthì nó sẽ đặt $ 1 thành asdf, và nếu echo $1bạn thấy asdf. Nếu bạn làmset a=5nó sẽ không đặt biến a, bằng 5. Nó sẽ đặt tham số vị trí $ 1 bằng chuỗi "a = 5". Vì vậy, nếu bạn đã từng thấy tập hợp a = 5 trong linux thì đó có thể là một sai lầm trừ khi ai đó thực sự muốn chuỗi a = 5, bằng $ 1. Một thứ khác mà tập hợp của linux có thể thiết lập, là các tùy chọn / thuộc tính shell. Nếu bạn thiết lập - bạn sẽ thấy danh sách chúng. Và bạn có thể làm ví dụ set -o verbose, tắt, để bật chi tiết (btw mặc định xảy ra là tắt nhưng điều đó không có gì khác biệt với điều này). Hoặc bạn có thể làm set +o verboseđể tắt tính dài dòng. Windows không có cách sử dụng như vậy cho lệnh thiết lập của nó.


trông giống như set hiển thị shell và môi trường, còn 'env' chỉ hiển thị môi trường
barlop 14/12/15

1
Thích câu trả lời này rất nhiều vì nó bao gồm các trường hợp nix và win có thể gây nhầm lẫn lúc đầu.
N0thing

6

Nói một cách dễ hiểu, các biến môi trường được đặt khi bạn mở một phiên trình bao mới. Tại bất kỳ thời điểm nào nếu bạn thay đổi bất kỳ giá trị biến nào, trình bao không có cách nào chọn thay đổi đó. điều đó có nghĩa là những thay đổi bạn đã thực hiện trở nên hiệu quả trong các phiên trình bao mới. Mặt khác export, lệnh cung cấp khả năng cập nhật phiên trình bao hiện tại về thay đổi bạn đã thực hiện đối với biến đã xuất. Bạn không cần phải đợi cho đến khi phiên shell mới sử dụng giá trị của biến mà bạn đã thay đổi.


1
Nhưng nếu tôi nói a=5thì echo $anó lại nói là 5. Tuy nhiên, bạn đã viết "bất cứ lúc nào nếu bạn thay đổi bất kỳ giá trị nào của biến, trình bao không có cách nào chọn thay đổi đó. Điều đó có nghĩa là những thay đổi bạn đã thực hiện trở nên có hiệu lực trong các phiên trình bao mới." . <- Vậy làm cách nào mà nó cập nhật phiên shell mà không cần xuất. Bạn có thể cho một ví dụ về nơi xuất khẩu là cần thiết?
barlop

Biến bạn đặt trong một phiên shell là một biến shell. nó cục bộ và có thể truy cập vào phiên shell hiện tại. bạn có thể thay đổi nó bất kỳ lúc nào bạn muốn và giá trị hiện tại của nó sẽ có sẵn cho quy trình shell hiện tại mà không cần xuất các thay đổi. mặt khác các biến môi trường được đặt tại thời điểm đăng nhập. khi bạn thay đổi bất kỳ giá trị nào của chúng, bạn cần thực hiện điều mà nói một cách đơn giản là làm mới làm cho giá trị mới có sẵn cho cả quy trình shell hiện tại và bất kỳ quy trình con mới nào. đó chính xác là những gì xuất khẩu.
katwekibs
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.