ZSH: Wo soll die Umgebungsvariable platziert werden, damit die gestartete Anwendung sie abholen kann?

4

Ich benötige eine Umgebungsvariable, KEY="value"die einer GUI-Anwendung zur Verfügung gestellt wird, bevor ich sie starte . Die Launcher-Datei (die das Symbol auf dem Desktop und in der Seitenleiste von Ubuntu platziert) hat den Wert Exec=/path/to/executable/file.

Wo sollte ich diese Variable bei Verwendung von ZSH definieren, damit sie für diese Anwendung verfügbar ist, unabhängig davon, ob ich auf den Anwendungsstarter klicke oder ob ich direkt / path / to / executable / file in meine Shell eingebe?

In meinem Kommandozeile, habe ich versucht , sowohl die Eingabe KEY="value"und export KEY="value"bevor das Startprogramm klicken, aber es hat nicht zu funktionieren scheint. Ich habe auch beide Zeilen in meinem ausprobiert ~/.zshrc, einen source ~/.zshrcvon meiner Shell aus gemacht und dann erneut auf den Launcher geklickt, aber das hat auch nicht funktioniert.

In welche Datei soll es gehen? Ich glaube , eine Wahl von ~/.zshenv, ~/.zprofile, ~/.zshrc, und ~/.zlogin.

(Soll ich Bonuspunkte verwenden exportoder nicht?)

(Muss ich mich mindestens abmelden und wieder anmelden, bevor die Variable beim Start über den Launcher für die Anwendung verfügbar wird?)

user779159
quelle

Antworten:

5

Da Sie möchten, dass die Variable auch in Ihren Terminal-Shells ( interaktive Nicht-Login-Shell ) und für die Desktop-Launcher-Symbole (X-Server gestartet von nicht-interaktiver Login-Shell ) definiert wird, sollten Sie die Definition in Ihre einfügen ~/.zshenv.

Und ja, Sie müssen Ihre x-session neu starten, damit die neue Umgebung für Ihre Desktopsymbole verfügbar ist. Stellen Sie sich ein solches Startschema vor: Graphical Login -> Use your default shell to start the X session -> Desktop -> Shell terminal / Launch program via iconDie untergeordneten Shells erben die Umgebung von den übergeordneten Shells, mit denen die X-Sitzung gestartet wird. Diese Shell hat die RC-Dateien nur einmal gelesen - bei Ihrer Anmeldung an der X-Sitzung.

Für den Bonuspunkt . Dies ist, was das Handbuch sagt:

export [ name[=value] ... ] Die angegebenen Namen werden für den automatischen Export von nachfolgend ausgeführten Befehlen in die Umgebung markiert. (...)

Wenn Sie Ihre Variable in definieren ~/.zshenv, können Sie das prinzipiell weglassen, exportda diese Datei standardmäßig eingelesen wird. Der einzige Unterschied ergibt sich, wenn Sie eine Shell mit starten zsh -f, die keine RC-Dateien bezieht. Eine kleine Demonstration:

% foo=foo_defined
% export bar=bar_defined
% print -l $foo $bar
foo_defined
bar_defined
% zsh -f
% print -l $foo $bar
bar_defined
% 

Ich e. $barIn nachfolgenden Shells wird nur der exportierte definiert. Aber um auf der sicheren Seite zu sein, verwenden Sie export- ich kann mir keinen Fall vorstellen, in dem dies schädlich ist.

mpy
quelle
Meinen Sie standardmäßig die Shell in / etc / passwd? Nehmen wir an, jemand verwendet bash als Standardshell, hat aber gnome-terminal so konfiguriert, dass es sich automatisch in ZSH öffnet. In diesem Fall wird .zshenv beim Start gelesen? Wenn nicht, gibt es eine Shell-unabhängige Datei, mit der Variablen wie diese platziert werden können? (Ich weiß, dass unter help.ubuntu.com/community/EnvironmentVariables Dinge wie ~ / .profile und ~ / .pam_environment beschrieben sind , aber wie passen diese zu Ihrer Antwort von ~ / .zshenv?)
user779159
@ user779159: Ja, standardmäßig habe ich die Shell gemeint, die in definiert wurde /etc/passwd. zshenvist zshspezifisch, gelesen wird so nicht in durch bash, cshoder was auch immer. Meine Antwort galt nur für zshgemäß Ihrem Fragetag. In einer inhomogenen Konfiguration (Standard-Shell, die keine Gnome-Terminal-Shell ist) erscheinen die Möglichkeiten in Ihrem Link sinnvoll. Ich würde die Variable einfügen ~/.profileund zshin gnome-terminal eine Login-Shell erstellen, indem ich zsh -lals Startbefehl verwende.
mpy
0

Ich glaube nicht, dass @mpy richtig ist, dass Sie die export-Anweisung weglassen können. Das Vorhandensein / Fehlen eines Exports bestimmt, ob von dieser Shell gestartete Prozesse die Umgebungsvariable erben. Wenn Sie nicht exportieren, erbt xserver die Umgebungsvariable nicht

 imalison  ~  ABCD='14'
 imalison  ~  python -c "import os; print os.environ.get('ABCD')"
None
 imalison  ~  export ABCD='14'
 imalison  ~  python -c "import os; print os.environ.get('ABCD')"
14
imalison
quelle