it-swarm-eu.dev

Skript BASH pro nastavení proměnných prostředí nefunguje

Napsal jsem následující skript, abych v případě potřeby nastavil některé proměnné prostředí.

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

Pod příkazem a výsledky, které vidím na svém terminálu: skript běží, ale proměnné nejsou nastaveny na konci.

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

~$: 

Co je špatně? Díky předem. Mirko

155
MirkoZa

export exportuje přiřazení proměnných do podřízených procesů prostředí, ve kterém byl spuštěn příkaz export. Prostředí příkazového řádku je nadřazený prostředí skriptu, takže nevidí přiřazení proměnných.

Můžete použít . (nebo source) bash příkaz k provedení příkazů skriptu v aktuálním prostředí Shell a dosažení toho, co chcete, např.

source ./script.sh
echo "$BASE"

Bude produkovat

/home/develop/trees

Příkaz source, často viděný ve skriptech, je bash synonymem pro ., která je součástí standardu POSIX (takže . je k dispozici například v pomlčce, ale source není).

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

(. script.sh a source script.sh nejprve vyhledá script.sh in PATH, takže je bezpečnější zadat cestu k script.sh.)

220
user21322

Při spuštění skriptu se spustí v podsíti. Proměnné jsou platné pouze v kontextu tohoto podshell. Nastavte je ve svém .bashrc nebo .profile a přečtěte si proměnné a subshells . Příkaz export pracuje dolů hierachy (aktuální Shell a všechny jeho subshells) ne nahoru, jako ve vašem příkladu.

Případně (pokud opravdu chcete, aby skript ovlivnil prostředí vašeho současného prostředí), spusťte jej jako:

. ./script.sh

To způsobí, že se spustí v aktuální Shell, ale nepředá proměnné ani hierarchii.

15
con-f-use

Často chci nastavit proměnnou prostředí bez potíží.

Zde je to, co přidám do svého .bashrc k implementaci tohoto pohodlí.

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