Vraag BASH-script om omgevingsvariabelen in te stellen die niet werken


Ik heb het volgende script geschreven om een ​​aantal omgevingsvariabelen in te stellen wanneer dat nodig is.

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

Hieronder de opdracht en de resultaten die ik op mijn terminal kan zien: het script wordt uitgevoerd, maar de variabelen worden niet ingesteld op het einde.

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

~$: 

Wat is er mis? Bij voorbaat bedankt. Mirko


102
2017-07-15 08:18


oorsprong




antwoorden:


export exporteert de variabele toewijzing naar sub schalen, d.w.z. shells die zijn gestart als kindprocessen van de shell die de bevat export richtlijn. Uw opdrachtregelomgeving is de ouder van de shell van het script, dus het ziet de variabele toewijzing niet.

U kunt de source bash-opdracht om de scriptopdrachten in de huidige shell-omgeving uit te voeren en te bereiken wat u wilt, bijvoorbeeld

source script.sh
echo $BASE

Zal produceren

/home/develop/trees

De . commando is een synoniem voor source wat vaak wordt gezien in scripts.

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

146
2017-07-15 08:53



Je hebt het niet nodig export om variabelen door te geven aan subshells, is een subshell een kopie van je huidige shell, inclusief variabelen en functies etc. Geëxporteerde variabelen worden gekopieerd naar nieuwe processen die uit de shell worden voortgebracht, ongeacht of dat proces een andere shell is of niet. Ten tweede, . is het POSIX-commando voor sourcing. Bash voegt eraan toe source als een beter leesbaar synoniem, maar je kunt er niet op vertrouwen dat het beschikbaar is in sh. tenslotte . ./script in plaats van . script als je verrassingen wilt voorkomen. mywiki.wooledge.org/BashFAQ/060 - geirha
Merk op dat als u een script EN een pipe gebruikt, de bronomgeving niet beschikbaar is voor de ouder. bijv. 'source setit.sh' is oke. 'source setit.sh | tee setit.log' is niet oke. Verrassend. Niet intuïtief. - gaoithe


Wanneer u een script uitvoert, wordt het in een submap uitgevoerd. Variabelen zijn alleen geldig binnen de context van die subshell. Zet ze in uw .bashrc of .profile en lees verder variabelen en subschalen. De export statement werkt onderaan hierachy (huidige shell en alle bijbehorende subschalen) niet zoals in je voorbeeld.

Als alternatief (als u echt wilt dat het script de omgeving van uw huidige shell beïnvloedt), voert u het uit als:

. ./script.sh

Dat zorgt ervoor dat het in uw huidige shell wordt uitgevoerd, maar ook geen variabelen in de hiërarchie doorgeeft.


6
2017-07-15 08:48





Ik wil vaak een omgevingsvariabele instellen zonder gedoe.

Dit is wat ik toevoeg aan mijn. Bashrc om dit gemak te implementeren.

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

4
2017-09-13 16:49





Je kunt zoiets proberen

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}

-1
2018-01-11 10:14