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