Shell-Skript zum Festlegen von Umgebungsvariablen


82

Ich möchte ein Shell-Skript schreiben, um Variablen zu exportieren.

Unten habe ich das Skript aufgelistet.

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"

Dies scheint jedoch nicht richtig zu funktionieren. Ich muss die Befehle stattdessen einzeln an der Shell-Eingabeaufforderung ausführen.


Welche Shell benutzt du (zB bash, ksh, sh)
Tom

Mögliches Duplikat von Save Global Variablen BASH
Tripleee


Antworten:


48

Bitte zeigen Sie uns weitere Teile des Skripts und teilen Sie uns mit, welche Befehle Sie einzeln ausführen mussten und einfach ausführen möchten.

In der Zwischenzeit müssen Sie doppelte Anführungszeichen und keine einfachen Anführungszeichen verwenden, um Variablen zu erweitern:

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

Semikolons am Ende eines einzelnen Befehls sind ebenfalls nicht erforderlich.

Bisher:

#!/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
...

Denn suSie können es ausführen mit:

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

Hinweis: Das OP hat nicht explizit nach Schritten zum Erstellen von Exportvariablen in einer interaktiven Shell mithilfe eines Shell-Skripts gefragt. Er bat nur darum, sein Drehbuch höchstens beurteilen zu lassen. Er erwähnte keine Details darüber, wie sein Skript verwendet werden würde. Es könnte mit .oder sourcevon der interaktiven Shell gewesen sein. Es könnte ein eigenständiger Skript gewesen sein, oder es könnte sourceaus einem anderen Skript stammen. Umgebungsvariablen sind nicht spezifisch für interaktive Shells. Diese Antwort löste sein Problem.


1
HI konsolebox !! Vielen Dank . aber ich habe den Unterschied nicht verstanden. export PATH = "/ home / linux / Practice / linux-devkit / bin /: $ PATH" in doppelten Anführungszeichen. & export CROSS_COMPILE = '/ home / linux / Practice / linux-devkit / bin / arm-arago-linux-gnueabi-' in einfachen Anführungszeichen. Das von u modifizierte Skript funktioniert einwandfrei.
Prag Rao

Die Erweiterung von @PragRao Paramater erfolgt einfach nicht in einfachen Anführungszeichen. Details zum Zitieren können Sie hier näher erläutern .
konsolebox

3
Der Name der @ konsolebox-Frage klingt wie "Shell-Skript zum Festlegen von Umgebungsvariablen". Der größte Teil der Community hat diese Frage nur gefunden, um das Problem zu lösen, dass diese Art von Skript über die aktuelle Shell ( sourceoder .) ausgeführt wird. Ich weiß es zu schätzen, dass Sie genau auf die Frage von OP antworten, aber ich habe dieses Thema von Google gefunden, und die nächste Antwort hat mir mehr geholfen als Ihre. Upvotes für die zweite Antwort (mit sourceund .bestätigen Sie meine Meinung ...
avtomaton

@avtomaton Auch hier geht es nicht um andere Leute, die es bei Google finden. Es geht nur um den ursprünglichen Ansatz der Frage. Wenn Sie Bedenken haben, wie eine Frage geändert oder wie eine Antwort präsentiert werden soll, sollten Sie sie in Meta diskutieren.
konsolebox

226

Sie müssen das Skript als sourceoder als Kurzform ausführen.

source ./myscript.sh

oder

. ./myscript.sh

Dies wird in der vorhandenen Shell ausgeführt, um sicherzustellen, dass alle vom Skript erstellten oder geänderten Variablen nach Abschluss des Skripts verfügbar sind.

Wenn Sie das Skript nur mit dem Dateinamen ausführen, wird das Skript in einer separaten Unterschale ausgeführt.


2
durch Verwendung der Quelle ./setenv.sh -: Gibt den Fehler "Quelle nicht gefunden" an. und mit. ./setenv.sh gibt es kann setenv.sh nicht öffnen. Können Sie mir bitte dabei helfen? Danke
Vishal

1
kratzte sich eine Stunde lang am Kopf, warum diese verdammten Exportvarianten dort nicht (zsh) versucht typeset -gx, exportiert usw. wurden und mein WTF hatten? Moment und doch - wusste nicht, dass eine Subshell mit einem eigenen Bereich ausgeführt wird. Danke, dass du meinen Tag vor dem bevorstehenden Wut-Miss-Management
gerettet hast

1

Führen Sie das Skript als source = aus, um es auch im Debug-Modus auszuführen.

source= ./myscript.sh

0

Ich kann es nicht mit lösen source ./myscript.sh. Es heißt, die Quelle habe keinen Fehler gefunden.
Fehlgeschlagen auch bei der Verwendung. ./myscript.sh . Es gibt kann nicht myscript.sh öffnen.

Meine Option ist es also, es in eine Textdatei zu schreiben, die im nächsten Skript aufgerufen wird.

#!/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
...

Rufen Sie es an, wann immer es benötigt wird:

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

1
Sie können dies myscript.shso ändern , dass eine Datei environment.shmit dem Namen (mit den Exportanweisungen) generiert environment.shwird, die bei Bedarf nur die Quelle anstelle der while-Schleife enthält.
Slajma
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.