Environs in Debian

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
s837ubc
Beiträge: 133
Registriert: 23.07.2013 14:17:01

Environs in Debian

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

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Environs in Debian

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!

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Re: Environs in Debian

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

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Environs in Debian

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!

Benutzeravatar
4A4B
Beiträge: 926
Registriert: 09.11.2011 11:19:55
Kontaktdaten:

Re: Environs in Debian

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

Benutzeravatar
bmario
Beiträge: 1256
Registriert: 05.09.2007 12:15:47
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dresden

Re: Environs in Debian

Beitrag von bmario » 12.04.2015 16:10:24

Mein Kristallkugel spuckt grade Debianenvironment-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

Re: Environs in Debian

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

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Environs in Debian

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. ;-)
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_18 hat geschrieben: The KornShell version of dot takes optional arguments that are set to the positional parameters. This is a valid extension that allows a dot script to behave identically to a function.
(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:

Code: Alles auswählen

$ set 1 2 3 4
$ . ./a      
[1 2 3 4]
foo[]
foo[1 2 3 4]
$
... 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:
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_18 hat geschrieben: If file does not contain a <slash>, the shell shall use the search path specified by PATH to find the directory containing file.
Use ed once in a while!

s837ubc
Beiträge: 133
Registriert: 23.07.2013 14:17:01

Re: Environs in Debian

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.

Antworten