2013-05-17 24 views
157

giả sử rằng tôi có kịch bản nàyTôi có thể xuất biến cho môi trường từ tập lệnh bash mà không cần tìm nguồn cung ứng không?

export.bash:

#! /usr/bin/env bash 
export VAR="HELLO, VARIABLE" 

khi tôi thực thi kịch bản, và cố gắng truy cập vào các $VAR tôi nhận được không có giá trị!

echo $VAR 

Có cách nào để truy cập vào các $VAR bằng cách chỉ thực hiện export.bash mà không cần tìm nguồn cung ứng nó?

+1

Bạn có thể thử sử dụng bí danh thay vì tập lệnh để xác định biến của bạn. – jdigital

+0

Kịch bản mà tôi đang làm việc, là một loại trình quản lý ảo java, tôi thực hiện một số tính toán sau đó tôi nên xuất một $ JAVA_HOME vào thư mục env và thêm nó vào PATH. – tarrsalah

+0

Vâng, bạn có thể viết thông tin vào một tập tin và sau đó đọc nó trở lại, nhưng tìm nguồn cung ứng dường như dễ dàng hơn nhiều. – jdigital

Trả lời

188

Có cách nào để truy cập vào các $VAR bằng cách chỉ thực hiện export.bash mà không cần tìm nguồn cung ứng nó?

câu trả lời nhanh: Số

Nhưng có một số cách giải quyết tốt.

Một rõ ràng nhất, mà bạn đã đề cập, là sử dụng source hoặc . để thực thi kịch bản trong bối cảnh của vỏ gọi:

$ cat set-vars1.sh 
export FOO=BAR 
$ . set-vars1.sh 
$ echo $FOO 
BAR 

Một cách khác là phải có kịch bản, chứ không phải hơn thiết lập một biến môi trường, lệnh in sẽ thiết lập các biến môi trường:

$ cat set-vars2.sh 
#!/bin/bash 

echo export FOO=BAR 
$ eval $(./set-vars2.sh) 
$ echo $FOO 
BAR 

Lưu ý rằng $(...) sẽ tham gia vào sản xuất vào một dòng đơn. Nếu bạn có nhiều thứ để đặt, bạn nên thêm dấu chấm phẩy vào các lệnh in để chúng vẫn hợp lệ sau khi được nối với nhau.

Một cách tiếp cận thứ ba là phải có một kịch bản mà bộ biến môi trường của bạn (s) trong nội bộ và sau đó gọi một lệnh chỉ định với môi trường:

$ cat set-vars3.sh 
#!/bin/bash 

export FOO=BAR 
exec "[email protected]" 
$ ./set-vars3.sh printenv | grep FOO 
FOO=BAR 

phương pháp cuối cùng này có thể khá hữu ích, mặc dù nó là bất tiện cho sử dụng tương tác vì nó không cung cấp cho bạn các cài đặt trong trình bao hiện tại của bạn (với tất cả các cài đặt và lịch sử khác mà bạn đã tạo).

+0

Kính gửi Đấng Cứu Rỗi! Cảm ơn. – lft93ryt

30

Để xuất ra biến VAR đầu tiên hợp lý nhất và dường như làm việc cách là nguồn biến:

. ./export.bash 

hoặc

source ./export.bash 

Bây giờ khi lặp lại từ vỏ chính nó hoạt động

echo $VAR 
HELLO, VARABLE 

Bây giờ chúng tôi sẽ đặt lại VAR

export VAR="" 
echo $VAR 

Bây giờ chúng ta sẽ thực hiện một kịch bản nguồn biến sau đó unset nó:

./test-export.sh 
HELLO, VARABLE 
-- 
. 

mã: mèo test-export.sh

#!/bin/bash 
    # Source env variable 
    source ./export.bash 

    # echo out the variable in test script 
    echo $VAR 

    # unset the variable 
    unset VAR 
    # echo a few dotted lines 
    echo "---" 
    # now return VAR which is blank 
    echo $VAR 

Dưới đây là một cách

XIN LƯU Ý: Xuất khẩu được giới hạn trong tập lệnh thực thi xuất trong giao diện điều khiển chính của bạn - cho đến khi một công việc cron tôi sẽ thêm nó giống như giao diện điều khiển như dưới đây ... cho phần lệnh vẫn đáng ngờ: đây là cách bạn sẽ chạy từ vỏ của bạn:

Mở dấu nhắc lệnh của bạn (miễn là export.bash có nhiều giá trị vang)

IFS=$'\n'; for entries in $(./export.bash); do export $entries; done; ./v1.sh 
HELLO THERE 
HI THERE 

mèo v1.sh

#!/bin/bash 
echo $VAR 
echo $VAR1 

Bây giờ chừng này là dành cho việc sử dụng của bạn - bạn có thể làm cho các biến có sẵn cho các kịch bản của bạn bất cứ lúc nào bằng cách thực hiện một bí danh bash như thế này:

myvars ./v1.sh 
HELLO THERE 
HI THERE 

echo $VAR 

. 

thêm video này vào .bashrc của bạn

function myvars() { 
    IFS=$'\n'; 
    for entries in $(./export.bash); do export $entries; done; 

    "[email protected]"; 

    for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable; 
done 

} 

nguồn tập tin .bashrc của bạn và bạn có thể làm như trên bất cứ lúc nào ...

Nhưng dù sao trở lại với phần còn lại của nó ..

này có làm cho nó có sẵn trên toàn cầu sau đó thực thi kịch bản ..

chỉ đơn giản là echo nó ra sau đó chạy xuất khẩu trên echo!

mèo export.bash

#!/bin/bash 
echo "VAR=HELLO THERE" 

Bây giờ trong kịch bản hoặc giao diện điều khiển của bạn chạy:

export "$(./export.bash)" 

Hãy thử:

echo $VAR 
HELLO THERE 

Nhiều giá trị, miễn là bạn biết những gì bạn đang mong đợi trong tập lệnh khác bằng cách sử dụng phương thức trên:

mèo export.bash

#!/bin/bash 
echo "VAR=HELLO THERE" 
echo "VAR1=HI THERE" 

mèo test-export.sh

#!/bin/bash 

IFS=$'\n' 
for entries in $(./export.bash); do 
    export $entries 
done 

echo "round 1" 
echo $VAR 
echo $VAR1 

for entries in $(./export.bash); do 
    variable=$(echo $entries|awk -F"=" '{print $1}'); 
    unset $variable 
done 

echo "round 2" 
echo $VAR 
echo $VAR1 

Bây giờ kết quả

./test-export.sh 
round 1 
HELLO THERE 
HI THERE 
round 2 


. 

và bản cập nhật chính thức cuối cùng để auto assign đọc BIẾN:

./test-export.sh 
Round 0 - Export out then find variable name - 
Set current variable to the variable exported then echo its value 
$VAR has value of HELLO THERE 
$VAR1 has value of HI THERE 
round 1 - we know what was exported and we will echo out known variables 
HELLO THERE 
HI THERE 
Round 2 - We will just return the variable names and unset them 
round 3 - Now we get nothing back 

Kịch bản: mèo test-export.sh

#!/bin/bash 

IFS=$'\n' 
echo "Round 0 - Export out then find variable name - " 
echo "Set current variable to the variable exported then echo its value" 
for entries in $(./export.bash); do 
variable=$(echo $entries|awk -F"=" '{print $1}'); 
export $entries 
eval current_variable=\$$variable 
echo "\$$variable has value of $current_variable" 
done 


echo "round 1 - we know what was exported and we will echo out known variables" 
echo $VAR 
echo $VAR1 

echo "Round 2 - We will just return the variable names and unset them " 
for entries in $(./export.bash); do 
variable=$(echo $entries|awk -F"=" '{print $1}'); 
unset $variable 
done 

echo "round 3 - Now we get nothing back" 
echo $VAR 
echo $VAR1 
+0

Tôi muốn xuất VAR bằng cách thực thi tệp chứ không phải tìm nguồn cung ứng. – tarrsalah

+0

@vahid bạn nên giải thích kịch bản của bạn đang làm gì. – FDinoff

+0

tại sao không bỏ đặt biến sau khi tìm nguồn cung ứng? nó dễ dàng hơn nhiều so với nỗi đau mà bạn đang cố gắng gây ra cho bản thân sẽ cập nhật kịch bản xuất khẩu thử nghiệm – Vahid

1

Câu trả lời là không, nhưng đối với tôi, tôi đã làm như sau

kịch bản: myExport

#! \bin\bash 
export $1 

một bí danh trong .bashrc của tôi

alias myExport='source myExport' 

Tuy nhiên bạn nguồn nó, nhưng có lẽ theo cách này, nó dễ sử dụng hơn và thú vị hơn cho người khác.

2

Một cách giải quyết khác, tùy thuộc vào từng trường hợp, nó có thể hữu ích: tạo một dấu gạch khác kế thừa biến đã xuất. Đó là một trường hợp đặc biệt của câu trả lời @Keith Thompson, sẽ là tất cả những hạn chế đó.

export.bash:

# !/bin/bash 
export VAR="HELLO, VARIABLE" 
bash 

Bây giờ là:

./export.bash 
echo $VAR 
8

Tìm thấy một cách thú vị và gọn gàng để xuất khẩu các biến môi trường từ một tập tin:

trong env.vars:

foo=test 
kịch bản

kiểm tra:

eval `cat env.vars` 
echo $foo   # => test 
sh -c 'echo $foo' # => 

export eval `cat env.vars` 
echo $foo   # => test 
sh -c 'echo $foo' # => test 

# a better one 
export `cat env.vars` 
echo $foo   # => test 
sh -c 'echo $foo' # => test 
1

Có lẽ bạn có thể viết một hàm trong ~/zshrc, ~/.bashrc.

# set my env 
[ -s ~/.env ] && export MYENV=`cat ~/.env` 
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv } 

Beacause biến sử dụng bên ngoài, bạn có thể tránh ghi tập lệnh.

Các vấn đề liên quan