Umgebung richtig einstellen

15

Ich verwende zsh und gdm, um gnome auszuführen. Vor einiger Zeit habe ich festgestellt, dass Variablen nicht richtig eingestellt sind. Zum Beispiel sind LANG / LC_ALL falsch ( ""anstelle von en_GB.UTF-8).

Ich teilte das .zshrcin .zshrcund auf .profile. In letzterem setze ich die Umgebungsvariablen, aber wie kann ich die Variablen setzen, bevor die Sitzung beginnt? Ich habe ein paar Möglichkeiten ausprobiert ( .xinitrc, .xsessionrc), aber keine schien zu funktionieren.

Bearbeiten Zur Verdeutlichung - Ich habe es verwendet .profileund manuell eingespeist .zshrc. Es ändert sich die Frage sowieso nicht.

Maciej Piechotka
quelle
Ist Ihr .profilenicht geladen oder überschreibt etwas anderes die Gebietsschemavariablen? (Versuchen Sie eine andere Variable Einstellung wie export MACIEJ_PROFILE=yessicher zu machen. set -xIn .profilekann einen guten Weg, um zu überprüfen , was in und nach ausgeführt wird .profile, wenn es überhaupt gelesen hat.) Es gibt keinen Punkt in der Beschaffung .profilevon .zshrc.
Gilles 'SO- hör auf böse zu sein'
Ist dies ein Problem in Terminalfenstern oder anderswo? Erhalten Sie beim Ausführen die gewünschten Ländereinstellungen ssh localhost zsh? Was ist ssh localhost bash? Wenn bash ok ist, aber nicht zsh, dann legst du vielleicht etwas hinein /etc/zshenvoder ~/.zshenv(was so ziemlich immer eine schlechte Idee ist).
Gilles 'SO- hör auf böse zu sein'
Nein, die Shell funktioniert einwandfrei (vor und nach dem Teilen). Das Problem ist, dass gnome-sessiondiese Variablen nicht gesetzt sind.
Maciej Piechotka

Antworten:

21

Die einfache Möglichkeit besteht darin, eine Zeitmaschine zu erfinden, die verschiedenen Personen zu besuchen, die Shell-Startdateien erstellt haben, und sie anzuweisen, drei Dinge sauber zu unterscheiden:

  • Sitzungsaufbau, zB Umgebungsvariablen;
  • Sitzungsstart, dh z. B. Starten einer Befehlszeilen-Shell oder eines Fenstermanagers oder Ausführen startx;
  • Shell-Initialisierung, z. B. Aliase, Eingabeaufforderung, Tastenkombinationen.

Es ist nicht allzu schwer, Session vs. Shell auf tragbare Weise richtig zu machen: Die Initialisierung zur Anmeldezeit erfolgt in .profile(oder .zprofileoder .login), die Shell-Initialisierung in .bashrcoder .zshrc. Ich habe vorher geschrieben über .bash_profile, zsh gegen andere Schalen , mehr über die Portabilität (meist über bash) , mehr darüber , wer liest.profile .

Ein verbleibendes Problem ist die Unterscheidung zwischen Sitzungsaufbau und Sitzungsstart. ~/.profileWird in den meisten Fällen ausgeführt, wenn Sie sich anmelden, und kann als beides verdoppelt werden. Es gibt jedoch Ausnahmen:

  • Wenn Ihre Anmeldeshell (t) csh oder zsh ist ~/.loginund ~/.zprofileanstelle von sourced verwendet wird ~/.profile. Das Gleiche gilt für bash und ~/.bash_profile, aber dies lässt sich leicht durch die Beschaffung ~/.profilevon lösen ~/.bash_profile.
  • Wenn Sie sich unter einem Anzeigemanager anmelden (xdm, gdm, kdm, ...), ~/.profilehängt das Lesen von Ihrer Version des Programms, Ihrer Distribution (Linux oder anders) und dem von Ihnen ausgewählten Sitzungstyp ab.
    • Wenn Sie sich darauf verlassen können, dass der Anzeigemanager eine Sitzung für Sie startet, .profilemüssen Sie Umgebungsvariablen festlegen, aber keine Sitzung starten (z. B. einen Fenstermanager).
    • Bei der herkömmlichen Konfigurationsdatei für X-Sitzungen ~/.xsessionwerden sowohl die Sitzungskonfiguration als auch der Sitzungsstart ausgeführt. So kann die Datei im Wesentlichen sein . ~/.xsession; . ~/.xinitrc. Einige Distributionen geben Quelle ~/.profilevor ~/.xsession. Moderne Distributionen werden nur dann ~/.xsessionals Quelle verwendet, wenn Sie im Display Manager eine benutzerdefinierte Sitzung auswählen. Eine solche Sitzung ist nicht immer verfügbar.
    • Ihr Sitzungsmanager hat möglicherweise eine eigene Methode zum Festlegen von Umgebungsvariablen. (Dies ist ein optionaler Teil Ihrer Desktop-Umgebung, den Sie über eine Konfigurationsdatei oder durch Auswahl eines Sitzungstyps bei der Anmeldung auswählen. Verwechseln Sie ihn nicht mit den vom Display Manager bereitgestellten Sitzungsstartskripten, die unter Ihrem Benutzer ausgeführt werden, sondern systemweit gewählt. Ja, es ist ein Chaos.)

Zusammenfassend ~/.profileist der richtige Ort für Umgebungsvariablen. Wenn es nicht gelesen wird, versuchen Sie es auszulesen ~/.xsession(und starten Sie Ihre X-Programme von dort aus), oder suchen Sie nach einer systemspezifischen Methode (die von Ihrer Distribution, dem Display Manager (falls vorhanden), dem Sitzungstyp (falls vorhanden) und der Desktop-Umgebung oder abhängig sein kann Session Manager).

Gilles 'SO - hör auf böse zu sein'
quelle
.xsessionwar die Datei, nach der ich gesucht habe.
Maciej Piechotka
1
Mit Ausnahme Ihrer Zusammenfassung stimme ich voll und ganz zu. Ich glaube nicht, dass Sie diesen Punkt begründet haben. Wenn Ihre .profileQuellen .bashrcoder ähnliches, dann können Sie sicher Set Umgebungsvariablen in .bashrcnicht nur anmelden Sitzungen, sondern auch für neue Schalen , die anderen Einstellungen benötigen, zB wenn Sie einen Start xtermaus gnome-terminalund verschiedene wollen dircolors.
Mikel
@Mikel Wenn Sie Umgebungsvariablen festlegen .bashrc, werden Ihre vorherigen Einstellungen überschrieben. Wenn Sie beispielsweise eine Screen- oder Tmux-Instanz mit bestimmten Umgebungsvariablen gestartet haben, .bashrcwerden diese Einstellungen durch alle Einstellungen außer Kraft gesetzt. LS_COLORSDies ist ein Sonderfall, da es sich tatsächlich um eine Einstellung pro Terminal handelt. Im Idealfall sollte es vom Terminal-Emulator festgelegt werden, und das Festlegen in einer Shell-RC-Datei ist eine Umgehungslösung.
Gilles 'SO- hör auf, böse zu sein'
1

In der Gentoo Dokumentation gibt es den Artikel Gentoo Linux Localization Guide . In Kapitel 3 wird das Gebietsschema festgelegt.

In den meisten Fällen legen Benutzer die LANG-Variable nur global fest. Dieses Beispiel gilt für ein deutsches Unicode-Gebietsschema:

Befehlsauflistung 3.1: Einstellen des Standard-Systemgebietsschemas in /etc/env.d/02locale

LANG="en_GB.UTF-8"

In meinem Gentoo LANGist diese Datei eingestellt und alles funktioniert einwandfrei ...

pbm@tauri ~ $ cat /etc/env.d/02locale 
LANG="pl_PL.UTF-8"

pbm@tauri ~ $ locale
LANG=pl_PL.UTF-8
LC_CTYPE="pl_PL.UTF-8"
LC_NUMERIC="pl_PL.UTF-8"
LC_TIME="pl_PL.UTF-8"
LC_COLLATE="pl_PL.UTF-8"
LC_MONETARY="pl_PL.UTF-8"
LC_MESSAGES="pl_PL.UTF-8"
LC_PAPER="pl_PL.UTF-8"
LC_NAME="pl_PL.UTF-8"
LC_ADDRESS="pl_PL.UTF-8"
LC_TELEPHONE="pl_PL.UTF-8"
LC_MEASUREMENT="pl_PL.UTF-8"
LC_IDENTIFICATION="pl_PL.UTF-8"
LC_ALL=
pbm
quelle
Beachten Sie, dass der von Ihnen angegebene Teil in .bashrcOrdnung ist. In der Anleitung wird jedoch auch empfohlen, eine falsche Umgebungsvariable festzulegen (siehe meine Antwort und insbesondere superuser.com/questions/217431 ).
Gilles 'SO - hör auf böse zu sein'
Vielen Dank für so detaillierte Informationen ... :) Ich habe diesen .bashrc-Teil noch nie verwendet - die Einstellungen in env.dsind universeller.
07.
Es ist auch pro System anstelle von pro Benutzer. Ich bevorzuge es, die Systemeinstellungen von den Benutzereinstellungen zu trennen.
Maciej Piechotka