2013-05-17 10 views
157

załóżmy, że mam ten skryptCzy mogę wyeksportować zmienną do środowiska ze skryptu Bash bez jej pozyskiwania?

export.bash:

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

kiedy wykonać skrypt, i starają się dostępem do $VAR otrzymuję żadnej wartości!

echo $VAR 

Czy jest jakiś sposób, aby uzyskać dostęp do $VAR po prostu wykonując export.bash bez zaopatrujących je?

+1

Możesz spróbować użyć aliasu zamiast skryptu do zdefiniowania swojej zmiennej. – jdigital

+0

Skrypt, nad którym pracuję, jest jakimś wirtualnym menedżerem java, wykonuję obliczenia, a następnie wyeksportuję plik $ JAVA_HOME do env i dołączam go do zmiennej PATH. – tarrsalah

+0

Cóż, możesz zapisać informacje do pliku, a następnie ponownie je odczytać, ale pozyskiwanie wydaje się znacznie łatwiejsze. – jdigital

Odpowiedz

188

Czy jest jakiś sposób, aby uzyskać dostęp do $VAR po prostu wykonując export.bash bez zaopatrujących je?

Szybka odpowiedź: Nie

Ale istnieje kilka możliwych obejścia.

Najbardziej oczywiste, co już wspomniano, jest użycie source lub . wykonać skrypt w kontekście powłoki numerem:

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

Innym sposobem jest mieć scenariusz, raczej niż ustawienie zmiennej środowiskowej, polecenia drukowania, który będzie ustawić zmienną środowiskową:

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

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

Należy pamiętać, że $(...) dołączy wyjście do jednej linii. Jeśli masz więcej niż jedną rzecz do ustawienia, powinieneś dodać średniki do drukowanych poleceń, aby były nadal prawidłowe po połączeniu.

Trzecim rozwiązaniem jest mieć skrypt, który ustawia zmienną środowiskową (y) wewnętrznie, a następnie wywołuje określone polecenia z tego środowiska:

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

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

To ostatnie podejście może być bardzo przydatna, jeśli jest to niewygodne dla interaktywne użycie, ponieważ nie daje ustawień w obecnej powłoce (z wszystkimi innymi ustawieniami i historią, które stworzyłeś).

+0

Drogi Zbawicielu! Dzięki. – lft93ryt

30

W celu eksportu poza zmienną VAR pierwszy najbardziej logiczne i wydaje pracy sposobem jest źródło zmiennej:

. ./export.bash 

lub

source ./export.bash 

Teraz gdy echa od osłony głównej działa

echo $VAR 
HELLO, VARABLE 

Będziemy teraz resetować VAR

export VAR="" 
echo $VAR 

Teraz wykonujemy skrypt do źródła zmiennej następnie rozbrojony to:

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

kod: kot 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 

Oto jeden sposób

UWAGA: Eksport ogranicza się do skryptu wykonującego eksport w głównej konsoli - tak długo, jak zadanie crona dodawałbym go jak konsolę jak poniżej ... dla części poleceń nadal wątpliwe: Oto jak chcesz uruchomić w powłoce z:

Na swoim wierszu poleceń (tak długo, jak export.bash ma wiele wartości echa)

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

koci v1.sh

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

teraz tak długo, jak to jest do użytku - można zrobić zmienne dostępne dla skryptów w dowolnym momencie, wykonując aliasu bash tak:

myvars ./v1.sh 
HELLO THERE 
HI THERE 

echo $VAR 

. 

dodać do .bashrc

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 

} 

źródło plik .bashrc i można zrobić tak jak powyżej każdej chwili ...

Zresztą z powrotem do reszty to ..

ma to udostępniono go globalnie, a następnie wykonano skrypt.

po prostu wyślij go, a następnie uruchom eksport na echo!

kot export.bash

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

Teraz wewnątrz skryptu lub twój bieg konsola:

export "$(./export.bash)" 

Spróbuj:

echo $VAR 
HELLO THERE 

Wiele wartości tak długo jak wiesz czego oczekujesz w innym skrypcie przy użyciu powyższej metody:

kota export.bash

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

kot 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 

Teraz wyniki

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


. 

a ostateczna wersja ostateczna aktualizacja do automatycznego przypisywania odczytać zmienne:

./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 

Skrypt: kot 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

Chcę wyeksportować VAR, wykonując plik, a nie przez jego pozyskanie. – tarrsalah

+0

@vahid powinieneś wyjaśnić, co robi twój skrypt. – FDinoff

+0

dlaczego nie usunąć zmiennej po pozyskaniu? to będzie dużo łatwiejsze niż ból, który próbujesz wywołać samemu, zaktualizuje skrypt wywołujący test, eksportując – Vahid

1

Odpowiedź brzmi nie, ale dla mnie to zrobiłem następujące

skrypt: myExport

#! \bin\bash 
export $1 

aliasu w moim .bashrc

alias myExport='source myExport' 

Wciąż jesteś zaopatrywać go, ale może w ten sposób jest bardziej użyteczny i jest interesujący dla kogoś innego.

2

Innym obejściem, które zależy od przypadku, może być przydatne: utworzenie kolejnego basha, który dziedziczy eksportowaną zmienną. Jest to szczególny przypadek odpowiedzi @Keith Thompson, czy wszystkie te wady.

export.bash:

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

Teraz:

./export.bash 
echo $VAR 
8

Znaleziony ciekawy i estetyczny sposób, aby wyeksportować zmienne środowiskowe z pliku:

w env.vars:

foo=test 
Skrypt

Test:

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

Być może można napisać funkcję w ~/.zshrc, ~/.bashrc.

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

Na podstawie zmiennej zewnętrznej można uniknąć zapisu pliku skryptu.

Powiązane problemy