Skrip BASH untuk mengatur variabel lingkungan tidak berfungsi

137

Saya telah menulis skrip berikut untuk mengatur beberapa variabel lingkungan saat diperlukan.

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH

Di bawah perintah dan hasil yang dapat saya lihat di terminal saya: skrip berjalan, tetapi variabel tidak diatur di akhir.

~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE

~$: 

Apa yang salah? Terima kasih sebelumnya. Mirko

MirkoZa
sumber

Jawaban:

194

exportmengekspor penugasan variabel ke proses anak dari shell di mana exportperintah itu dijalankan. Lingkungan baris perintah Anda adalah induk dari shell skrip, sehingga tidak melihat penugasan variabel.

Anda dapat menggunakan .(atau source) perintah bash untuk menjalankan perintah skrip di lingkungan shell saat ini dan mencapai apa yang Anda inginkan, misalnya

source ./script.sh
echo "$BASE"

Akan menghasilkan

/home/develop/trees

The sourceperintah, sering terlihat di skrip, adalah sinonim bash untuk ., yang merupakan bagian dari standar POSIX (sehingga .tersedia di dasbor, misalnya, tetapi sourcetidak).

. ./script.sh     # identical to "source ./script.sh"

( . script.shDan source script.shpertama akan mencari script.shdi PATH, jadi lebih aman untuk menentukan path ke script.sh.)

muru
sumber
29
Anda tidak perlu exportmeneruskan variabel ke subkulit, subkulit adalah salinan dari shell Anda saat ini, termasuk variabel dan fungsi dll. Variabel yang diekspor akan disalin ke proses baru yang dihasilkan dari shell, terlepas dari proses itu menjadi shell lain atau tidak. Kedua, .adalah perintah POSIX untuk sumber. Bash menambahkan sourcesebagai sinonim yang lebih mudah dibaca untuknya, tetapi Anda tidak dapat mengandalkannya yang tersedia di sh. Terakhir . ./scriptalih-alih . scriptjika Anda ingin menghindari kejutan. mywiki.wooledge.org/BashFAQ/060
geirha
Perhatikan bahwa jika Anda sumber skrip DAN menggunakan pipa maka lingkungan bersumber tidak tersedia untuk orang tua. mis. 'source setit.sh' tidak apa-apa. 'sumber setit.sh | tee setit.log' tidak apa-apa. Mengejutkan. Tidak intuitif.
gaoithe
10

Saat Anda menjalankan skrip, skrip berjalan dalam subkulit. Variabel hanya valid dalam konteks subkulit itu. Atur di .bashrcatau atau .profilebaca variabel dan subkulit Anda . The exportPernyataan bekerja bawah hirarki (shell saat ini dan semua subkulit itu) tidak sampai seperti dalam contoh Anda.

Atau (jika Anda benar-benar ingin skrip mempengaruhi lingkungan shell Anda saat ini) jalankan sebagai:

. ./script.sh

Itu menyebabkannya berjalan di shell Anda saat ini tetapi tidak akan melewatkan variabel hierarki.

membingungkan
sumber
5

Saya sering ingin mengatur variabel lingkungan tanpa kerumitan.

Inilah yang saya tambahkan ke .bashrc saya untuk mengimplementasikan kenyamanan ini.

defect() {
    if [ $1 ] && [ -z $2 ]
    then
        eval 'export DEFECT=$1'
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}
Jlettvin
sumber
-1

Anda dapat mencoba sesuatu seperti ini

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
silentsudo
sumber