Bir değişkeni kaynak yapmadan bash betiğinden çevreye aktarabilir miyim?


282

Bu komut dosyasına sahip olduğumu varsayalım

ihracat. bas :

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

Komut dosyasını yürüttüğümde ve erişmeye çalıştığımda $VARdeğer kazanmıyorum!

echo $VAR

$VARSadece export.bash kaynağını kullanmadan çalışmanın herhangi bir yolu var mı ?


1
Değişkeninizi tanımlamak için komut dosyası yerine takma ad kullanmayı deneyebilirsiniz.
jdigital

Üzerinde çalıştığım script, bir tür java sanal yöneticisi, biraz hesaplama yapıyorum, sonra env'ye bir $ JAVA_HOME vermeli ve PATH'e eklemeliyim.
tarrsalah

Bilgileri bir dosyaya yazıp sonra tekrar okuyabilirsiniz, ancak kaynak kullanımı çok daha kolay görünüyor.
jdigital

7
alt süreçler ebeveynlerinin ortamını değiştiremez. Ebeveyn kendini değiştirmeyi seçmelidir (ya da sourceya evalda ...)
Glenn Jackman

1
Kaynak hakkında daha fazla okumak için, man sourceişe yaramaz çünkü sourcebash içine inşa edilmiştir, çalıştırmak gerekirhelp source
peterchaula

Yanıtlar:


318

Kaynak olmadan $VARyürütmek yoluyla erişmek için herhangi bir yolu var mı export.bash?

Hızlı cevap: Hayır.

Ancak birkaç olası çözüm vardır.

Daha önce bahsettiğiniz, en belirgin olanı, komut dosyasını çağrı kabuğu bağlamında kullanmak sourceveya .yürütmektir:

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

Başka bir yol da, ortam değişkenini ayarlamak yerine komut dosyasını ortam değişkenini ayarlayacak yazdırma komutlarına sahip olmaktır:

$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR

Üçüncü yaklaşım, ortam değişkenlerinizi dahili olarak ayarlayan ve daha sonra bu ortamla belirtilen bir komutu çağıran bir komut dosyasına sahip olmaktır:

$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

Bu son yaklaşım oldukça yararlı olabilir, ancak mevcut kabuğunuzdaki ayarları vermediğinden (oluşturduğunuz diğer tüm ayarlar ve geçmiş ile) etkileşimli kullanım için elverişsizdir.


57

Önce VAR değişkenini dışa aktarmak için en mantıklı ve çalışma yolu gibi görünmektedir:

. ./export.bash

veya

source ./export.bash

Şimdi ana kabuktan yankılanırken işe yarıyor

 echo $VAR
HELLO, VARABLE

Şimdi VAR'ı sıfırlayacağız

export VAR=""
echo $VAR

Şimdi değişkeni kaynaklamak için bir komut dosyası yürütecağız ve ayarını kaldıracağız:

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

kodu: kedi 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

İşte bir yol

LÜTFEN AKLINIZDA BULUNDURUN: Dışa aktarmalar ana konsolunuzda dışa aktarmayı yürüten komut dosyasıyla sınırlıdır. kabuğundan koş:

Komut isteminizde (export.bash öğesinin birden çok yankı değeri olduğu sürece)

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

kedi v1.sh

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

Artık bu kullanımınız için olduğu sürece - böyle bir bash takma adı yaparak değişkenleri komut dosyalarınız için istediğiniz zaman kullanılabilir hale getirebilirsiniz:

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

bunu .bashrc'nize ekleyin

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

    "$@"; 

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

}

kaynak bashrc dosyanızı ve istediğiniz zaman yukarıdaki gibi yapabilirsiniz ...

Her neyse geri kalanına ...

Bu, global olarak kullanılabilir hale getirdikten sonra betiği çalıştırdı.

sadece yankılamak sonra yankı ihracat çalıştırın!

kedi ihracatı

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

Şimdi komut dosyasında veya konsolunuz şu şekilde çalışıyor:

 export "$(./export.bash)"

Deneyin:

echo $VAR
HELLO THERE

Yukarıdaki yöntemi kullanarak başka bir komut dosyasında ne beklediğinizi bildiğiniz sürece birden çok değer:

kedi ihracatı

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

kedi testi-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

Şimdi sonuçlar

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


.

ve otomatik atama için son son güncelleme VARIABLES'i okuyun:

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

Komut dosyası: cat 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

VAR'ı kaynak yaparak değil, dosyayı yürüterek vermek istiyorum.
tarrsalah

@vahid betiğinizin ne yaptığını açıklamalısınız.
FDinoff

1
neden kaynak sonra değişken unset? Kendinize neden olmaya çalıştığınız acıdan çok daha kolay olacak
VH

Bunu yapmanın alternatif bir yolunu verdim Tarrsalah
VH

tamam son güncellemeler - önerilen yöntemle ilgili sorunlar ve bashrc takma adı fikri etrafında çalışmak muhtemelen harika bir yol olacaktır
VH

22

gerçekleştirmek

set -o allexport

Bundan sonra bir dosyadan kaynakladığınız değişkenler kabuğunuza aktarılır.

source conf-file

İşiniz bittiğinde çalıştırın. Bu, allexport modunu devre dışı bırakır.

set +o allexport

7
Sorunun tamamı "Kaynak olmadan nasıl dışa aktarılır" sorusudur. Bu cevap kaynağı kullanıyor.
Gittim

@ekkis Evet, soruyu tam olarak cevaplamıyor, ancak bir dosyadan değişkenleri nasıl dışa aktaracağımı her zaman bu konu ortaya çıktı. Bu yüzden sadece kendim için koydum.
1919

basit ve kullanımı kolay. bu cevap olarak işaretlenmelidir.
QkiZ

1
Bunu onayladım çünkü orijinal sorun ifadesi bunun temel çözümüm olduğunu anlamamı sağladı. Burada allexport'ta resmi dokümanlar var: gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
benjaoming

ahh, +1. Bu soru bash source exportGoogle'da anahtar kelimenin üst sonucudur
ttimasdf

14

Ortam değişkenlerini bir dosyadan dışa aktarmanın ilginç ve temiz bir yolunu buldu:

içinde env.vars:

foo=test

test komut dosyası:

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

7

Duruma bağlı olarak başka bir geçici çözüm yararlı olabilir: dışa aktarılan değişkeni devralan başka bir bash oluşturma. @Teith Thompson cevabının belirli bir vakası, tüm bu dezavantajlar olacak.

export.bash:

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

Şimdi:

./export.bash
echo $VAR

Yazdıklarınızın işe yaradığından emin misiniz !? Satır komutunu yürütmeniz gerektiğine inanıyorum:. ./export.bash
Sir Jo Black

Sir Jo Black, evet, tabi. Export.bash dosyasının son satırı bashgeçerli kabuğun alt öğesi olarak çağrılır . Ve VARdaha önce ihraç edildiğinden beri , bu çağırma değişkeni içerecektir. Yazarsanız Tabii ki, dışarı gidecek. Kontrol ettin mi? exitVAR
Gonmator

Tamam! Bu çağrıyı görmedim ...: p
Sir Jo Black

1

Cevap hayır, ama benim için aşağıdakileri yaptım

komut dosyası: myExport

#! \bin\bash
export $1

.bashrc dosyamdaki bir takma ad

alias myExport='source myExport' 

Hala onu kaynak, ama belki bu şekilde daha kullanışlı ve başka biri için ilginç.


1

Belki ~ / .zshrc, ~ / .bashrc içine bir işlev yazabilirsiniz.

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

Dışında değişken kullanım nedeniyle, komut dosyası yazmaktan kaçınabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.