Skrypt powłoki do ustawiania zmiennych środowiskowych

84

Chciałbym napisać skrypt powłoki do eksportowania zmiennych.

Poniżej wymieniłem skrypt.

echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH='/home/linux/Practise/linux-devkit/bin/:$PATH';
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-';
echo "Export CROSS_COMPILE done"

Ale to nie wydaje się działać poprawnie. Zamiast tego muszę indywidualnie wykonywać polecenia w wierszu polecenia powłoki.

Prag Rao
źródło
Której powłoki używasz (np. Bash, ksh, sh)
Tom,
możliwy duplikat Zapisz zmienne globalne BASH
tripleee
Prawdopodobnie duplikat eksportu nie działa w moim skrypcie powłoki
użytkownik

Odpowiedzi:

49

Pokaż nam więcej części skryptu i powiedz nam, jakie polecenia musiałeś wykonać indywidualnie i chcesz po prostu.

W międzyczasie, aby rozwinąć zmienne, musisz używać podwójnych cudzysłowów, a nie pojedynczego cudzysłowu:

export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"

Niepotrzebne są również średniki na końcu pojedynczego polecenia.

Jak dotąd:

#!/bin/sh
echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

Ponieważ sumożesz go uruchomić za pomocą:

su -c 'sh /path/to/script.sh'

Uwaga: OP nie prosił wprost o kroki, jak utworzyć zmienne eksportu w interaktywnej powłoce przy użyciu skryptu powłoki. Poprosił tylko o co najwyżej ocenę scenariusza. Nie wspomniał o szczegółach dotyczących wykorzystania jego scenariusza. Mogło to być za pomocą .lub sourcez poziomu powłoki interaktywnej. Mógł to być samodzielny skrypt lub mógł pochodzić sourcez innego skryptu. Zmienne środowiskowe nie są specyficzne dla powłok interaktywnych. Ta odpowiedź rozwiązała jego problem.

konsolebox
źródło
1
HI konsolebox !! Dziękuję Ci bardzo . ale nie rozumiem różnicy. export PATH = "/ home / linux / Practice / linux-devkit / bin /: $ PATH" w podwójnych cudzysłowach. & eksportuj CROSS_COMPILE = '/ home / linux / Practice / linux-devkit / bin / arm-arago-linux-gnueabi-' w pojedynczych cudzysłowach. skrypt zmodyfikowany przez u działa dobrze.
Prag Rao
Rozszerzenie @PragRao Paramater po prostu nie występuje w pojedynczych cudzysłowach. Można wyjaśnili szczegóły o cytowanie dalej tutaj .
konsolebox,
3
Nazwa pytania @konsolebox brzmi jak „Skrypt powłoki do ustawiania zmiennych środowiskowych” - większość społeczności znalazła to pytanie tylko po to, aby rozwiązać problem z uruchamianiem tego rodzaju skryptu z bieżącej powłoki ( sourcelub .). Doceniam, że odpowiadasz dokładnie na pytanie OP, ale znalazłem ten temat z google, a następna odpowiedź pomogła mi bardziej niż twoja. Głosy za drugą odpowiedzią (z sourcei .potwierdzam moją opinię ...
avtomaton
@avtomaton Ponownie, nie chodzi o innych ludzi, którzy znajdą go w Google. Chodzi tylko o oryginalne podejście do pytania. Jeśli masz obawy dotyczące tego, jak należy zmienić pytanie lub jak należy przedstawić odpowiedź, rozważ omówienie tego w meta.
konsolebox
230

Musisz uruchomić skrypt jako sourcelub skrót.

source ./myscript.sh

lub

. ./myscript.sh

Będzie to działać w istniejącej powłoce, zapewniając, że wszelkie zmienne utworzone lub zmodyfikowane przez skrypt będą dostępne po zakończeniu działania skryptu.

Uruchomienie skryptu tylko przy użyciu nazwy pliku spowoduje wykonanie skryptu w osobnej podpowłoce.

mbaird
źródło
2
używając source ./setenv.sh -: podaje błąd nie znaleziono źródła. i używając. ./setenv.sh daje nie można otworzyć setenv.sh. Czy możesz mi w tym pomóc? Dzięki
Vishal
1
drapałem się w głowę przez godzinę, dlaczego tych cholernych varów eksportowych nie ma (zsh) próbowałem typeset -gx, eksportować itp. i miał mój wtf? w chwili, a jednak - nie wiedziałem, że podpowłoka jest wykonywana z własnym zakresem. dzięki za uratowanie mojego dnia przed zbliżającym się zarządzaniem
brakiem
1

Uruchom skrypt jako source =, aby uruchomić również w trybie debugowania.

source= ./myscript.sh
Anurag Mondal
źródło
0

Nie mogę tego rozwiązać source ./myscript.sh. Mówi, że źródło nie zostało znalezione.
Niepowodzenie również podczas używania . ./myscript.sh. Nie można otworzyć myscript.sh.

Więc moja opcja jest umieszczona w pliku tekstowym, który zostanie wywołany w następnym skrypcie.

#!/bin/sh
echo "Perform Operation in su mode"
echo "ARCH=arm" >> environment.txt
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export "CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?" >> environment.txt
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

Tnen nazywaj to, kiedy jest to potrzebne:

while read -r line; do
    line=$(sed -e 's/[[:space:]]*$//' <<<${line})
    var=`echo $line | cut -d '=' -f1`; test=$(echo $var)
    if [ -z "$(test)" ];then eval export "$line";fi
done <environment.txt
Chetabahana
źródło
1
Możesz zmodyfikować myscript.shtak, aby generował plik o nazwie environment.sh(z instrukcjami eksportu), a następnie po prostu źródło environment.shzamiast pętli while, gdy zajdzie taka potrzeba.
slajma