Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
s837ubc
- Beiträge: 133
- Registriert: 23.07.2013 14:17:01
Beitrag
von s837ubc » 11.04.2015 20:19:34
Hallo,
innerhalb eines Bash-Script soll ein Environ-Eintrag gesetzt bzw. geändert oder ausgelesen werden.
In einem Beispiel-Script wurde wie folgt vorgegangen:
Code: Alles auswählen
#!/bin/bash
# Environs setzen (aktuelle Sitzung)
# Environs entfernen (aktuelle temporär)
case "$1" in
"set" )
`export TEST="$2"`
echo "TEST=$TEST"
;;
"get" )
echo "TEST=$TEST"
;;
"list" )
printenv
;;
*)
esac
Im Beispielscript wird die Environ "TEST" gesetzt bzw. ausgelesen.
Leider ist es so, dass eine Änderung zwar gesetzt werden kann, beim Auslesen jedoch immer der alte Inhalt ausgelesen wird.
Frage: Kann mir jemand mitteilen, wie man eine Environ erfolgreich setzen kann, deren Inhalt nur bis zum Abmelden erhalten sein soll?
Zuletzt geändert von
Meillo am 12.04.2015 10:03:24, insgesamt 1-mal geändert.
Grund: Hunderte unnoetige Leerzeichen entfernt
-
Meillo
- Moderator
- Beiträge: 9235
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 12.04.2015 10:08:22
Mit ``Environs'' meinst du wohl Environment Variables, also Umgebungsvariablen.
Deine Idee funktioniert nicht, weil Umgebungsvariablen nur an Kindprozesse vererbt werden koennen, nicht aber an Elternprozesse uebergeben werden koennen. Dein Shellscript ist ein eigener Prozess. Du kannst mit ihm nicht den Prozess der aufrufenden Shell veraendern.
Du musst die Befehle in dem Case-Konstrukt schon direkt ausfuehren.
(btw: Die Backticks waeren unnoetig gewesen.)
Use ed once in a while!
-
peschmae
- Beiträge: 4844
- Registriert: 07.01.2003 12:50:33
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: nirgendwo im irgendwo
Beitrag
von peschmae » 12.04.2015 12:27:31
Was du natürlich machen könntest ist von deiner jeweiligen shell-session das script mittels "source script.sh" bzw. ". script.sh" aufzurufen. Dann werden Umgebungsvariablenänderungen übernommen (ich denke mal da wird dann der code ohne sub-shell gleich in der aktuellen shell ausgeführt)
MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy
-
Meillo
- Moderator
- Beiträge: 9235
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 12.04.2015 12:50:40
peschmae hat geschrieben:Was du natürlich machen könntest ist von deiner jeweiligen shell-session das script mittels "source script.sh" bzw. ". script.sh" aufzurufen. Dann werden Umgebungsvariablenänderungen übernommen (ich denke mal da wird dann der code ohne sub-shell gleich in der aktuellen shell ausgeführt)
Das stimmt, aber da kann man keine Parameter uebergeben. Es wird einfach der Inhalt des Scripts ausgefuehrt, wie wenn man ihn von Hand in kopiert haette. Aehnlich ist es bei Aliasen.
Use ed once in a while!
-
4A4B
- Beiträge: 962
- Registriert: 09.11.2011 11:19:55
-
Kontaktdaten:
Beitrag
von 4A4B » 12.04.2015 14:57:36
Mit einer Funktion (in ~/.bashrc) sollte es aber gehen? Parameter können dieser ja übergeben werden und die Umgebungsvariablenänderungen sollten auch übernommen werden, da die Funktion nicht in einer Subshell ausgeführt wird
-
bmario
- Beiträge: 1257
- Registriert: 05.09.2007 12:15:47
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Dresden
Beitrag
von bmario » 12.04.2015 16:10:24
Mein Kristallkugel spuckt grade
environment-modules aus.
Nichts zu tun ist viel besser,
als mit viel Mühe nichts zu schaffen. - Laotse
-
Cae
- Beiträge: 6349
- Registriert: 17.07.2011 23:36:39
- Wohnort: 2130706433
Beitrag
von Cae » 12.04.2015 16:16:18
Meillo hat geschrieben:peschmae hat geschrieben:Was du natürlich machen könntest ist von deiner jeweiligen shell-session das script mittels "source script.sh" bzw. ". script.sh" aufzurufen. Dann werden Umgebungsvariablenänderungen übernommen (ich denke mal da wird dann der code ohne sub-shell gleich in der aktuellen shell ausgeführt)
Das stimmt, aber da kann man keine Parameter uebergeben.
Jein:
Code: Alles auswählen
bash$ cat a
# shell script fragment
echo "[$@]"
foo() {
echo "foo[$@]"
}
foo
foo "$@"
bash$ . a
[]
foo[]
foo[]
bash$ . a test foo bar
[test foo bar]
foo[]
foo[test foo bar]
bash$ PS1='dash$ ' sh
dash$ . ./a
[]
foo[]
foo[]
dash$ . ./a test foo bar
[]
foo[]
foo[]
dash$
... ist also wohl ein Bash-"Feature".
Interessanterweise verwendet die
dash fuer
source nicht den angegebenen relativen Pfad, sondern fuehrt eine
$PATH-Suche (?!) durch:
Code: Alles auswählen
stat("/usr/local/bin/a", 0x7fffb8c22160) = -1 ENOENT (No such file or directory)
stat("/usr/bin/a", 0x7fffb8c22160) = -1 ENOENT (No such file or directory)
stat("/bin/a", 0x7fffb8c22160) = -1 ENOENT (No such file or directory)
stat("/usr/bin/X11/a", 0x7fffb8c22160) = -1 ENOENT (No such file or directory)
stat("/usr/games/a", 0x7fffb8c22160) = -1 ENOENT (No such file or directory)
Soll das so?
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
-
Meillo
- Moderator
- Beiträge: 9235
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 12.04.2015 17:27:16
Cae hat geschrieben:Meillo hat geschrieben:
Das stimmt, aber da kann man keine Parameter uebergeben.
Jein:
[...]
... ist also wohl ein Bash-"Feature".
Stimmt, die bash kann das, ebenso die ksh. Aber schauen wir doch an der Quelle definitiver Information nach: POSIX.
(In POSIX heisst das ``source''-Kommando ``dot'', denn das Schluesselwort ``source'' ist unportabel. Und der Punkt heisst im Unix-Slang ``dot''.)
Und dann noch aus der Manpage der mksh:
If arguments are given, the positional parameters may be used to access them while file is being executed. If no arguments are given, the positional parameters are those of the environment the command is used in.
Im letzten Satz liegt dann auch ein moeglicher portabler Workaround:
... und dann bekommt `a' die Argumente `arg1' und `arg2' ``uebergeben''. (Die positional Parameters der Shell werden natuerlich ueberschrieben.)
Interessanterweise verwendet die
dash fuer
source nicht den angegebenen relativen Pfad, sondern fuehrt eine
$PATH-Suche (?!) durch:
Code: Alles auswählen
stat("/usr/local/bin/a", 0x7fffb8c22160) = -1 ENOENT (No such file or directory)
stat("/usr/bin/a", 0x7fffb8c22160) = -1 ENOENT (No such file or directory)
stat("/bin/a", 0x7fffb8c22160) = -1 ENOENT (No such file or directory)
stat("/usr/bin/X11/a", 0x7fffb8c22160) = -1 ENOENT (No such file or directory)
stat("/usr/games/a", 0x7fffb8c22160) = -1 ENOENT (No such file or directory)
Soll das so?
Es entspricht zumindest POSIX:
Use ed once in a while!
-
s837ubc
- Beiträge: 133
- Registriert: 23.07.2013 14:17:01
Beitrag
von s837ubc » 06.05.2015 13:22:02
Hallo,
vielen Dank für die vielen Informationen und Script-Beispiele.
Da das Verfahren doch nicht so trival ist, wurde das angestrebte Verfahren umgestellt auf temporäre Dateien.
Die Werte werden dann eben in einer Datei, die sich im Pfad /tmp befindet, gespeichert.
In einem anderen Script wird geprüft, ob noch jemand angemeldet ist. Falls keiner mehr angemeldet ist, werden alle Dateien gelöscht.