ZSH: Wo ist die Umgebungsvariable zu platzieren, damit die gestartete Anwendung sie aufnehmen kann?

7610
user779159

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

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

In meiner Eingabeaufforderung habe ich versucht, beide einzugeben KEY="value"und export KEY="value"vor dem Klicken auf den Launcher zu klicken, aber es schien nicht zu funktionieren. Ich habe auch diese beiden Zeilen in meiner ausprobiert ~/.zshrc, eine source ~/.zshrcvon meiner Shell aus gemacht und dann den Launcher erneut angeklickt, aber das hat auch nicht funktioniert.

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

(Für Bonuspunkte sollte ich verwenden exportoder nicht?)

(Muss ich mich mindestens abmelden und erneut anmelden, bevor die Variable für die Anwendung verfügbar ist, wenn sie vom Startprogramm aus gestartet wird?)

3

2 Antworten auf die Frage

4
mpy

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

Und ja, Sie müssen Ihre x-Sitzung erneut 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 iconSo erben die untergeordneten Shells die Umgebung von dem übergeordneten Element, das zum Starten der X-Sitzung verwendet wird. Diese Shell liest die RC-Dateien nur einmal - beim Anmelden an der X-Sitzung.

Für den Bonuspunkt . Das sagt das Handbuch:

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

Wenn Sie Ihre Variable in definieren ~/.zshenv, können Sie diese prinzipiell weglassen, exportda diese Datei standardmäßig eingelesen wird. Der einzige Unterschied entsteht, wenn Sie eine Shell mit starten zsh -f, die keine RC-Dateien enthält. 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 %  

I. e. Nur der Export $barwird in nachfolgenden Shells definiert. Aber auf der sicheren Seite, verwenden Sie export- ich kann mir keinen Fall vorstellen, in dem dies schädlich ist.

Standardmäßig meinst du die in / etc / passwd? Angenommen, 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 es Dinge wie ~ / .profile und ~ / .pam_environment gibt, die auf https://help.ubuntu.com/community/EnvironmentVariables beschrieben werden, aber wie passen diese zu Ihrer Antwort von ~ / .zshenv?) user779159 vor 10 Jahren 0
@ user779159: Ja, mit _default shell_ meinte ich das in `/ etc / passwd` definierte. `zshenv` ist` zsh`-spezifisch, wird also nicht von `bash`,` csh` oder was auch immer gelesen. Meine Antwort traf nur auf "zsh" zu, je nach Fragetag. In einem inhomogenen Setup (Standard-Shell außer Gnome-Terminal-Shell) erscheinen die Möglichkeiten in Ihrem Link sinnvoll. Ich würde die Variable in `~ / .profile` einfügen und` zsh` in gnome-terminal zu einer _login shell_ machen, indem ich `zsh -l` als Startbefehl verwende. mpy vor 10 Jahren 0
0
imalison

Ich glaube nicht, dass @mpy richtig ist, dass Sie die Exportanweisung weglassen können. Das Vorhandensein / Nichtvorhandensein von Export 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