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

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


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.


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
}

-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}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.