Bisakah saya mengekspor variabel ke lingkungan dari skrip bash tanpa sumber?

282

Misalkan saya punya skrip ini

export.bash :

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

Ketika saya menjalankan skrip dan mencoba mengakses $VAR, saya tidak mendapatkan nilai!

echo $VAR

Apakah ada cara untuk mengakses $VARdengan hanya menjalankan export.bash tanpa sumber?

tarrsalah
sumber
1
Anda dapat mencoba menggunakan alias alih-alih skrip untuk menentukan variabel Anda.
jdigital
Script yang sedang saya kerjakan, adalah semacam manajer virtual java, saya melakukan perhitungan maka saya harus mengekspor $ JAVA_HOME ke env, dan menambahkannya ke PATH.
tarrsalah
Nah, Anda bisa menulis info ke file dan kemudian membacanya kembali, tetapi sumber tampaknya jauh lebih mudah.
jdigital
7
proses anak tidak dapat mengubah lingkungan orang tua mereka. Orang tua harus memilih untuk mengubah dirinya sendiri (baik dengan sourceatau evalatau ...)
glenn Jackman
1
Untuk membaca lebih lanjut tentang sumber, man sourcetidak akan berfungsi karena sourcedibangun ke dalam bash, Anda perlu menjalankanhelp source
peterchaula

Jawaban:

319

Apakah ada cara untuk mengakses $VARdengan hanya menjalankan export.bashtanpa sumber?

Jawaban cepat: Tidak.

Tetapi ada beberapa kemungkinan penyelesaian.

Yang paling jelas, yang telah Anda sebutkan, adalah menggunakan sourceatau .menjalankan skrip dalam konteks shell panggilan:

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

Cara lain adalah memiliki skrip, daripada mengatur variabel lingkungan, perintah cetak yang akan mengatur variabel lingkungan:

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

Pendekatan ketiga adalah memiliki skrip yang menetapkan variabel lingkungan Anda secara internal dan kemudian memanggil perintah yang ditentukan dengan lingkungan itu:

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

Pendekatan terakhir ini bisa sangat berguna, meskipun tidak nyaman untuk penggunaan interaktif karena tidak memberi Anda pengaturan di shell Anda saat ini (dengan semua pengaturan dan riwayat lain yang telah Anda buat).

Keith Thompson
sumber
57

Untuk mengekspor variabel VAR terlebih dahulu, cara yang paling logis dan berfungsi adalah dengan mengambil variabel:

. ./export.bash

atau

source ./export.bash

Sekarang ketika menggema dari shell utama berfungsi

 echo $VAR
HELLO, VARABLE

Kami sekarang akan mereset VAR

export VAR=""
echo $VAR

Sekarang kita akan menjalankan skrip untuk sumber variabel kemudian hapus itu:

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

kode: cat 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

Ini satu cara

TOLONG DICATAT: Ekspor terbatas pada skrip yang menjalankan ekspor di konsol utama Anda - jadi sejauh pekerjaan cron saya akan menambahkannya seperti konsol seperti di bawah ini ... untuk bagian perintah masih dipertanyakan: di sini adalah bagaimana Anda akan dijalankan dari shell Anda:

Pada prompt perintah Anda (selama export.bash memiliki beberapa nilai gema)

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

kucing v1.sh

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

Sekarang selama ini untuk penggunaan Anda - Anda bisa membuat variabel tersedia untuk skrip Anda kapan saja dengan melakukan alias bash seperti ini:

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

tambahkan ini ke .bashrc Anda

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

}

sumber file bashrc Anda dan Anda dapat melakukannya seperti di atas kapan saja ...

Bagaimanapun kembali ke sisanya ..

Ini telah membuatnya tersedia secara global kemudian menjalankan skrip ..

cukup gema lalu jalankan ekspor pada gema!

ekspor kucing

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

Sekarang dalam skrip atau menjalankan konsol Anda:

 export "$(./export.bash)"

Mencoba:

echo $VAR
HELLO THERE

Banyak nilai selama Anda tahu apa yang Anda harapkan dalam skrip lain menggunakan metode di atas:

ekspor kucing

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

cat 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

Sekarang hasilnya

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


.

dan pembaruan akhir akhir untuk penetapan otomatis membaca VARIABEL:

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

Script: 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
VH
sumber
Saya ingin mengekspor VAR dengan mengeksekusi file, bukan dengan sumbernya.
tarrsalah
@ahid Anda harus menjelaskan apa yang sedang dilakukan skrip Anda.
FDinoff
1
mengapa tidak menghapus variabel setelah sumber? itu akan jauh lebih mudah daripada rasa sakit yang Anda coba buat sendiri akan memperbarui skrip tes-ekspor
VH
Saya memberikan cara alternatif untuk melakukannya Tarrsalah
VH
update terakhir ok - masalah dengan metode yang disarankan dan bekerja di sekitar ide bashrc alias mungkin akan menjadi cara yang bagus sebagainya
VH
22

Menjalankan

set -o allexport

Setiap variabel yang Anda sumber dari file setelah ini akan diekspor di shell Anda.

source conf-file

Setelah selesai, eksekusi. Ini akan menonaktifkan mode allexport.

set +o allexport
mdornfe1
sumber
7
Seluruh poin dari pertanyaan adalah "Bagaimana cara mengekspor tanpa sumber". Jawaban ini menggunakan sumber.
Gonen I
@ekkis Ya itu tidak benar-benar menjawab pertanyaan, tetapi setiap kali saya mencari cara untuk mengekspor variabel dari file, utas ini muncul. Jadi saya agak meletakkannya di sana untuk diri saya sendiri.
mdornfe1
sederhana dan mudah digunakan. ini harus ditandai sebagai jawabannya.
QkiZ
1
Saya membatalkan ini karena pernyataan masalah awal membuat saya mengerti bahwa ini adalah solusi mendasar saya. Ada dokumen resmi tentang allexport di sini: gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
benjaoming
ahh, +1. Pertanyaan ini adalah hasil kata kunci teratas bash source exportdi Google
ttimasdf
14

Menemukan cara yang menarik dan rapi untuk mengekspor variabel lingkungan dari file:

di env.vars:

foo=test

skrip uji:

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
mobil van
sumber
7

Solusi lain yang, tergantung pada kasusnya, bisa berguna: membuat bash lain yang mewarisi variabel yang diekspor. Ini adalah kasus khusus dari jawaban @Keith Thompson, apakah semua kelemahannya.

export.bash:

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

Sekarang:

./export.bash
echo $VAR
Gonmator
sumber
Apakah Anda yakin apa yang Anda tulis berhasil !? Saya percaya bahwa Anda harus menjalankan perintah baris:. ./export.bash
Sir Jo Black
@ Sir Jo Black, ya, tentu. Baris terakhir file export.bash dipanggil bashsebagai anak dari shell saat ini. Dan sejak VARdiekspor sebelumnya, permohonan itu akan menyertakan variabel. Tentu saja, jika Anda mengetik exityang VARakan keluar. Sudahkah kamu periksa?
Gonmator
Baik! Saya belum pernah melihat permohonan itu ...: p
Sir Jo Black
1

Jawabannya adalah tidak, tetapi bagi saya saya melakukan yang berikut

skrip: myExport

#! \bin\bash
export $1

alias di .bashrc saya

alias myExport='source myExport' 

Masih Anda sumber, tapi mungkin dengan cara ini lebih bisa digunakan dan menarik bagi orang lain.

Malcomar
sumber
1

Mungkin Anda bisa menulis fungsi di ~ / .zshrc, ~ / .bashrc.

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

Karena menggunakan variabel di luar, Anda dapat menghindari menulis file skrip.

zhi.yang
sumber