staging.inyokaproject.org

Umgebungsvariable funktioniert nicht

Status: Gelöst | Ubuntu-Version: Kubuntu 22.04 (Jammy Jellyfish)
Antworten |

Zoner

Anmeldungsdatum:
30. August 2019

Beiträge: 120

Ich habe ein Script im Einsatz, dass ich etwas verbessern möchte. Ein Zustand soll nur während der ShellSession zwischengespeichert werden:

Dies hier funktioniert:

1
2
3
4
5
6
7
if irgendwas
then touch '/ordner/datei'
fi

if test -f '/ordner/datei'
then tuirgendwas
fi

und möchte ich durch folgendes ersetzen:

1
2
3
4
5
6
7
if irgendwas
then INDIKATOR='true'
fi

if [ "$INDIKATOR" == 'true' ]
then tuirgendwas
fi

Aber das wiederum funktioniert (in meinem Fall) nicht.

Unter welchen Umständen funktionieren die Umgebungsvariablen nicht, während andere Dinge (touch) funktionieren?

Bzw. gibt es bessere Alternativen um einen Wert zwischen zu speichern?

Das hier ist der Code der nur mit "Touch" (anstelle von $ERROR) funktioniert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
scriptfunktion1 ()      {
                cat $PfadzurDatei | while read line;do
                        data=$(echo ${line#*' '})
                        sha_saved=$(echo ${line%%' '*})
                        sha_now=$(sha256sum "$data" | cut -d ' ' -f1)
                        if      [ ! "$sha_now" == "$sha_saved" ]
                        then
                        echo -e "$data"
                        ERROR='true'
                        fi
        fi
                                                    done
                        }

scriptfunktion2 ()      {
        if      [ "$ERROR" == 'true' ]
            then
                echo "1"
            else
                echo "2"
        fi
                        }

Kann es sein, dass "done" die Umgebungsvariable ($ERROR) aufhebt, weil sie sich innerhalb einer Schleife befindet?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Das ist ein bisschen wenig Input, weil wir nicht sehen können, was Du wirklich erreichen willst. Die Logik, die Du am Anfang präsentierst, ergibt nicht so viel Sinn. Z.Z. fehlt völlig, unter welchen Umständen Du die Datei wieder löscht.

Ich vermute aber, das Du darüber stolperst, dass die Umgebungsvariablen, die Du in einer Shell setzt, höchstens an Kindprozesse aber niemals an den Parent vererbt werden. Die Datei ist im Gegenzug für alle Prozesse sichtbar.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

Subshells können keine Umgebungsvariablen an die übergeordnete Shell weitergeben. Man kann außerhalb der Subshell definierte Variablen durch diese manipulieren lassen:

1
2
3
4
5
6
declare -i counter=0
for i in {1..10}
do
    counter=i
done
echo $counter

Außerdem kann man Funktionen Werte zurückgeben lassen (für Fehler bzw. nicht-Fehler reicht der Exit-Code, ansonsten kann man auf stdout (oder stderr) schreiben und das in einer Variable in der aufrufenden Shell speichern - z.B.:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
count() {
    declare -i inner_counter=0 # diese Variable ist local
    for i in {1..10}
    do
        inner_counter=i
    done
    echo $inner_counter
}
counter=$(count)
echo $counter

Zoner

(Themenstarter)

Anmeldungsdatum:
30. August 2019

Beiträge: 120

rklm schrieb:

Das ist ein bisschen wenig Input, weil wir nicht sehen können, was Du wirklich erreichen willst. Die Logik, die Du am Anfang präsentierst, ergibt nicht so viel Sinn. Z.Z. fehlt völlig, unter welchen Umständen Du die Datei wieder löscht.

Ich vermute aber, das Du darüber stolperst, dass die Umgebungsvariablen, die Du in einer Shell setzt, höchstens an Kindprozesse aber niemals an den Parent vererbt werden. Die Datei ist im Gegenzug für alle Prozesse sichtbar.

Sorry, ich habe versucht die Sache übersichtlich zu halten, weil meine Posts gerne schnell ausufern. Die Löschbedingung empfand ich als unwichtig, weil ja bereits das Setzen schon nicht funktionierte. (bzw. das schon, aber nicht das Auslesen, wie ich jetzt weiß)

Wenn in der Funktion "scriptfunktion1" mindestens einmal "echo -e "$data"" ausgeführt wird (was nicht immer der Fall ist), wollte ich eine dauerhafte Variable setzen (für die Dauer der gesamten Shellsession), die später weitere Dinge auslöst und dabei dann wieder zurück gesetzt wird.

Über den Begriff Subshells bin ich schon gestolpert, hab die Themen dazu aber ignoriert, weil ich mir dachte "Subshells brauche ich gerade nicht". Ich wusste nicht, dass das in meinem Fall bereits eine Subshell ist. Jetzt bin ich wieder schlauer. Das kommt davon wenn man gleich ins Detail geht, statt sich erstmal grundlegend mit dem Thema Shell zu befassen.

Die Löschbedingung sah vorher so aus:

1
2
3
4
5
6
7
8
9
if    irgendwas
then  touch '/ordner/datei'
fi

if test -f '/ordner/datei'
then  rm '/ordner datei'
      tuirgendwas
else  tuwasanderes
fi

@ seahawk1986

Danke, sowas habe ich gesucht.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17432

Apropos: Umgebungsvariablen

Umgebungsvariablen werden vom System gesetzt und können mit env abgefragt werden. Solche dagegen, die man selbst gesetzt hat, und mit set abfragen kann (wobei set AUCH die Umgebungsvariablen anzeigt) nennt man Shellvariablen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Zoner schrieb:

Sorry, ich habe versucht die Sache übersichtlich zu halten, weil meine Posts gerne schnell ausufern.

Lobenswert, aber in diesem Fall hast Du für mich zu viel weggelassen.

Die Löschbedingung empfand ich als unwichtig, weil ja bereits das Setzen schon nicht funktionierte. (bzw. das schon, aber nicht das Auslesen, wie ich jetzt weiß)

Ja, aber die hätte einem vielleicht verraten, was Du überhaupt erreichen willst. Das ist mir nämlich immer noch nicht klar.

Wenn in der Funktion "scriptfunktion1" mindestens einmal "echo -e "$data"" ausgeführt wird (was nicht immer der Fall ist), wollte ich eine dauerhafte Variable setzen (für die Dauer der gesamten Shellsession), die später weitere Dinge auslöst und dabei dann wieder zurück gesetzt wird.

Und mit "Shellsession" meinst Du das offene Terminal? Oder wann beginnt und endet die Shellsession für Dich?

Antworten |