Skrypt BASH do ustawiania niedziałających zmiennych środowiskowych

137

Napisałem następujący skrypt, aby w razie potrzeby ustawić niektóre zmienne środowiskowe.

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

Poniżej polecenia i wyników, które widzę na moim terminalu: skrypt działa, ale zmienne nie są ustawione na końcu.

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

~$: 

Co jest nie tak? Z góry dziękuję. Mirko

MirkoZa
źródło

Odpowiedzi:

193

exporteksportuje przypisanie zmiennej do procesów potomnych powłoki, w której uruchomiono exportpolecenie. Środowisko wiersza polecenia jest rodzicem powłoki skryptu, więc nie widzi przypisania zmiennej.

Możesz użyć polecenia .(lub source) bash, aby wykonać polecenia skryptu w bieżącym środowisku powłoki i osiągnąć to, co chcesz, np

source ./script.sh
echo "$BASE"

Będzie produkować

/home/develop/trees

sourcePoleceń, często postrzegane w skryptach, jest synonimem dla bash ., który jest częścią standardu POSIX (więc .jest dostępny w desce rozdzielczej, na przykład, ale sourcenie jest).

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

( . script.shi source script.shnajpierw szuka script.shw PATH, więc bezpieczniej jest określić ścieżkę do script.sh).

muru
źródło
29
Nie trzeba exportprzekazywać zmiennych do podpowłoki, podpowłoka jest kopią bieżącej powłoki, w tym zmiennych i funkcji itp. Wyeksportowane zmienne są kopiowane do nowych procesów spawnowanych z powłoki, niezależnie od tego, czy jest to kolejna powłoka, czy nie. Po drugie, .to polecenie POSIX do pozyskiwania. Bash dodaje sourcejako bardziej czytelny synonim, ale nie można polegać na tym, że jest dostępny w sh. Wreszcie . ./scriptzamiast tego, . scriptjeśli chcesz uniknąć niespodzianek. mywiki.wooledge.org/BashFAQ/060
geirha
Zauważ, że jeśli pobierasz skrypt ORAZ używasz potoku, środowisko źródłowe nie jest dostępne dla rodzica. np. „source setit.sh” jest w porządku. „source setit.sh | tee setit.log” nie jest w porządku. Zaskakujący. Nie intuicyjne.
gaoithe
10

Po uruchomieniu skryptu działa on w podpowłoce. Zmienne są prawidłowe tylko w kontekście tej podpowłoki. Ustaw je w swoim .bashrclub .profilei czytaj o zmiennych i podpowłokach . exportOświadczenie działa w dół hierarchię (bieżącej powłoki i wszystkich jego podpowłok) nie jako na swoim przykładzie.

Alternatywnie (jeśli naprawdę chcesz, aby skrypt wpływał na środowisko twojej bieżącej powłoki), uruchom go jako:

. ./script.sh

Powoduje to, że działa on w bieżącej powłoce, ale nie przekazuje zmiennych do hierarchii.

dezorientować
źródło
5

Często chcę bezproblemowo ustawić zmienną środowiskową.

Oto, co dodaję do mojego .bashrc, aby zaimplementować tę wygodę.

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

Możesz spróbować czegoś takiego

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
silentsudo
źródło