Çalışmayan ortam değişkenlerini ayarlamak için BASH komut dosyası


137

Gerektiğinde bazı ortam değişkenlerini ayarlamak için aşağıdaki betiği yazdım.

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

Komutun ve terminalimde görebildiğim sonuçların altında: komut dosyası çalışıyor, ancak değişkenler sonunda ayarlanmadı.

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

~$: 

Sorun nedir? Şimdiden teşekkürler. Mirko

Yanıtlar:


194

exportdeğişken atamasını, exportkomutun çalıştırıldığı kabuğun alt işlemlerine verir . Komut satırı ortamınız, betiğin kabuğunun üstüdür , bu nedenle değişken atamasını görmez.

Sen kullanabilirsiniz .(veya source, örneğin komut geçerli kabuk ortamında komutları yürütmek ve ne istediğinizi elde etmek için) bash komutunu

source ./script.sh
echo "$BASE"

Üretecek

/home/develop/trees

Genellikle sourcekomut dosyalarında görülen komut, .POSIX standardının bir parçası olan bash eş anlamlısıdır (bu nedenle .çizgi olarak kullanılabilir, ancak sourcedeğil).

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

( . script.shVe source script.shilk arayacaktır script.shiçinde PATH, bu yüzden yolunu belirtmek için güvenlidir script.sh.)


29
exportDeğişkenleri alt kabuklara aktarmanız gerekmez , alt kabuk, değişkenler ve işlevler dahil olmak üzere geçerli kabuğunuzun bir kopyasıdır. Dışa aktarılan değişkenler, o işlemin başka bir kabuk olmasına bakılmaksızın, kabuktan alınan yeni işlemlere kopyalanır. İkincisi, .kaynak bulma için POSIX komutudur. Bash sourcebunun için daha okunaklı bir eşanlamlı olarak ekler , ancak sh konumunda mevcut olduğuna güvenemezsiniz. Son olarak . ./scriptyerine . scriptSürprizleri kaçınmak istiyorsanız. mywiki.wooledge.org/BashFAQ/060
geirha

Bir komut dosyası kaynakladıysanız ve bir pipo kullanırsanız, kaynak ortamın ebeveyn için uygun olmadığını unutmayın. örneğin 'source setit.sh' tamam. 'kaynak setit.sh | tee setit.log' tamam değil. Şaşırtıcı. Sezgisel değil.
saat

10

Bir komut dosyasını çalıştırdığınızda, bir alt kabukta çalışır. Değişkenler yalnızca bu alt kabuk bağlamında geçerlidir. Bunları sizin .bashrcveya içinde ayarlayın .profileve değişkenleri ve alt kabuklarını okuyun . Bu exportifade, örneğinizde olduğu gibi değil, hierachy (mevcut kabuk ve tüm alt kabuklar) üzerinde çalışır.

Alternatif olarak (betiğin mevcut kabuğunuzun ortamını etkilemesini gerçekten istiyorsanız) aşağıdaki gibi çalıştırın:

. ./script.sh

Bu, mevcut kabuğunuzda çalışmasına neden olur, ancak değişkenleri de hiyerarşiden geçirmez.


5

Sık sık uğraşmadan bir ortam değişkeni ayarlamak istiyorum.

İşte bu kolaylığı uygulamak için .bashrc'ime eklediğim şey.

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

-1

Böyle bir şeyi deneyebilirsin

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
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.