Làm cách nào để tôi có thể tạo các biến môi trường được xuất khẩu trong một tập lệnh shell xung quanh?


54

Tôi có nhiều tài khoản Amazon EC2 và muốn nhanh chóng có thể chuyển đổi các biến, chẳng hạn như $EC2_HOME, sử dụng tập lệnh.

Tôi có một kịch bản shell được thiết lập như thế này:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

Khi tôi chạy tập lệnh, tôi biết rằng nó đã EC2_HOMEđược đặt, nhưng tôi nghĩ rằng việc sử dụng exportsẽ làm cho biến trở nên ổn định sau khi tập lệnh hoàn thành. Nó không, vì chạy echo $EC_HOMEkhông hiển thị bất cứ điều gì.

Tôi biết điều này phải là kiến ​​thức kịch bản Linux rất thô sơ, nhưng tôi không biết điều đó. Tôi đã cố gắng tìm kiếm các câu hỏi liên quan mà không gặp may mắn - vì vậy tôi xin lỗi nếu đây là một bản sao.

Câu trả lời:


60

Bạn nên nguồn kịch bản của bạn, với

. ./script

hoặc là

source ./script

19
Lý do là tập lệnh của bạn tạo ra một quy trình shell mới như là một phần tử con của shell hiện tại. Bất kỳ thay đổi môi trường bạn thực hiện trong quá trình con có thể ảnh hưởng đến cha mẹ. Khi bạn sử dụng .hoặc source, bạn không sinh ra một tiến trình con mới, bạn đang chạy các lệnh trong trình bao hiện tại.
glenn jackman

1
@glennjackman Tôi có một vấn đề tương tự và tôi đã thử giải pháp của bạn nhưng nó đã loại tôi ra khỏi vỏ khi tôi làm .hoặc source. Tại sao chuyện này đang xảy ra ?
Patryk

7
@Patryk: có thể tập lệnh của bạn có một exitcâu lệnh, vì vậy nó không phù hợp để có nguồn gốc.
enzotib

Trong khi source ./scripthoạt động hoàn toàn tốt, sudo source ./script.shnói sudo: source: command not found. Làm thế nào tôi có thể làm điều này bằng cách sử dụng sudo?
71GA

1
@ 71GA: tùy thuộc vào tùy chọn biên dịch cho sudovà tùy thuộc vào cài đặt cấu hình, /etc/sudoersbạn có thể hoặc không thể bảo vệ môi trường của mình khi chạy các lệnh với sudo. Tôi đề nghị bạn cố gắng tìm nguồn kịch bản của mình và sau đó chạy sudovới -Etùy chọn để bảo vệ môi trường. Nếu nó không hoạt động, tôi cho rằng có rất ít bạn có thể làm.
enzotib

35

Khi bạn chạy một tập lệnh, nó sẽ có lớp vỏ riêng và môi trường riêng, nó sẽ biến mất một lần nữa ngay sau khi tập lệnh kết thúc. Để giữ các biến môi trường xung quanh, hãy nhập tập lệnh vào trình bao hiện tại của bạn:

$ source ./a.sh

hoặc tương đương (nhưng có thể di chuyển hơn một chút) sử dụng lệnh chấm POSIX :

$ . ./a.sh

Sau đó, các định nghĩa sẽ được đưa vào môi trường shell hiện tại của bạn và được kế thừa bởi bất kỳ chương trình nào bạn khởi chạy từ nó.

Để gần hơn với việc chạy tập lệnh, . a.shsẽ tìm a.sh bằng cách tìm kiếm các thư mục trong PATHbiến môi trường.


Có một số sự tinh tế trong cách hành xử của những người này, và liệu .sourcecó giống nhau (hoặc hiện tại không). . ./a.shchắc chắn sẽ cư xử như nhau trong mỗi vỏ POSIX-tương thích, nhưng source.. a.sh. ./a.sh, có thể khác nhau. Đối với Bash source.giống nhau trong mọi trường hợp; cho zsh sourceluôn kiểm tra thư mục hiện tại trước ; ksh về cơ bản là tương tự nhau.

Nếu tên tập lệnh được đưa ra dưới dạng một đường dẫn (chứa a /), đường dẫn đó được sử dụng trực tiếp trong mọi trường hợp. Điều đáng tin cậy nhất để làm là . ./scripthoặc . /path/to/script.


1

Chỉ để ghi lại.

Nếu bạn muốn chạy tập lệnh từ internet, xuất env sang hệ thống

bạn có thể sử dụng định dạng sau

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

Ví dụ:

source <(curl -s -L https://example.com/install.sh)

Có vẻ nguy hiểm nhưng hữu ích nếu bạn tin tưởng vào kịch bản đó!
Mark Stewart
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.