Impostazione corretta dell'ambiente


15

Sto usando zsh e gdm per eseguire gnome. Qualche tempo fa ho scoperto che le variabili non sono impostate correttamente. Ad esempio LANG / LC_ALL non sono corretti ( ""anziché en_GB.UTF-8).

Ho diviso .zshrcin .zshrce .profile. In quest'ultimo caso ho impostato le variabili di ambiente, ma come posso impostare le variabili prima dell'inizio della sessione? Ho provato alcune scelte ( .xinitrc, .xsessionrc) ma nessuna sembrava funzionare.

Modifica Per chiarire: l'ho usato .profilee inserito manualmente.zshrc . Non cambia comunque domanda.


Il tuo .profilenon è affatto caricato o qualcos'altro sovrascrive le variabili locali? (Prova a impostare qualche altra variabile come export MACIEJ_PROFILE=yesper assicurarti. set -xIn .profilepotrebbe essere un buon modo per controllare cosa viene eseguito in e dopo .profile, se è letto affatto.) Non ha senso provenire .profileda .zshrc.
Gilles 'SO- smetti di essere malvagio' il

È un problema in Windows Terminal o altrove? Ricevi le impostazioni locali desiderate quando corri ssh localhost zsh? Che dire ssh localhost bash? Se bash è ok ma non zsh, forse metti qualcosa /etc/zshenvo ~/.zshenv(che è quasi sempre una cattiva idea).
Gilles 'SO- smetti di essere malvagio' l'

No la shell funziona correttamente (prima e dopo la divisione). Il problema è che gnome-sessionquesto set di variabili non è impostato.
Maciej Piechotka,

Risposte:


21

Il modo semplice è inventare una macchina del tempo, visitare le varie persone che hanno ideato i file di avvio della shell e dire loro di distinguere chiaramente tra tre cose:

  • impostazione della sessione, ad es. variabili di ambiente;
  • avvio della sessione, ad es. avvio di una shell della riga di comando o un gestore di finestre o esecuzione startx;
  • inizializzazione della shell, ad es. alias, prompt, combinazioni di tasti.

Non è troppo difficile ottenere una sessione o una shell in modo portatile: l'inizializzazione del tempo di accesso va in .profile(o .zprofile, o .login), l'inizializzazione della shell va in .bashrco .zshrc. Ho già scritto .bash_profile, zsh contro altre shell , più su portabilità (per lo più su bash) , più su chi legge.profile .

Un problema rimanente è la distinzione tra impostazione della sessione e avvio della sessione. Nella maggior parte dei casi, ~/.profileviene eseguito quando si accede e può raddoppiare come entrambi, ma ci sono eccezioni:

  • Se la shell di accesso è (t) csh o zsh ~/.logine~/.zprofile viene fornita invece di ~/.profile. Idem per bash e ~/.bash_profile, ma questo è facilmente risolvibile approvvigionamento ~/.profileda ~/.bash_profile.
  • Se accedi con un display manager (xdm, gdm, kdm, ...), la ~/.profilelettura dipende dalla versione del programma, dalla tua distribuzione (Linux o altro) e dal tipo di sessione che scegli.
    • Se si conta sul display manager per avviare una sessione, è .profilenecessario impostare le variabili di ambiente ma non avviare una sessione (ad esempio un gestore di finestre).
    • Il file di configurazione tradizionale per le sessioni X è ~/.xsession, eseguendo sia la configurazione della sessione che l'avvio della sessione. Quindi il file può essere essenzialmente . ~/.xsession; . ~/.xinitrc. Alcune fonti di distribuzioni~/.profile prima ~/.xsession. Le distribuzioni moderne vengono generate solo ~/.xsessionquando si seleziona una sessione "personalizzata" dal display manager e tale sessione non è sempre disponibile.
    • Il gestore della sessione potrebbe avere il proprio modo di impostare le variabili di ambiente. (Questa è una parte facoltativa del tuo ambiente desktop, scelta da te tramite un file di configurazione o selezionando un tipo di sessione al momento del login; non confonderlo con gli script di avvio della sessione forniti dal display manager, che vengono eseguiti sotto il tuo utente ma scelto a livello di sistema. Sì, è un casino.)

In sintesi, ~/.profileè il posto giusto per le variabili di ambiente. Se non viene letto, prova a cercarlo da ~/.xsession(e avvia i tuoi programmi X da lì) o cerca un metodo specifico del sistema (che può dipendere dalla tua distribuzione, da eventuali display manager, dal tipo di sessione se display manager e dall'ambiente desktop o gestore di sessioni).


.xsessionera il file che stavo cercando.
Maciej Piechotka,

1
Sono pienamente d'accordo con tutto tranne il tuo riepilogo. Non credo che tu abbia stabilito questo punto. Se si tratta di .profileorigini .bashrco simili, è possibile impostare in modo affidabile variabili di ambiente .bashrcnon solo per le sessioni di accesso, ma anche per le nuove shell che richiedono impostazioni diverse, ad esempio se si avvia un xtermda gnome-terminale si desidera un diverso dircolors.
Mikel,

@Mikel Se imposti le variabili d'ambiente .bashrc, queste sostituiranno le tue impostazioni precedenti. Ad esempio, se hai avviato un'istanza Screen o Tmux con particolari variabili di ambiente, tutto ciò che hai impostato .bashrcsovrascriverà queste impostazioni. LS_COLORSè un caso speciale perché è davvero un'impostazione per terminale; idealmente dovrebbe essere impostato dall'emulatore di terminale, e impostarlo in un file shell rc è una soluzione alternativa.
Gilles 'SO- smetti di essere malvagio' il

1

Nella documentazione di Gentoo c'è l'articolo Guida alla localizzazione di Gentoo Linux . Il capitolo 3 riguarda l'impostazione della locale.

In genere, gli utenti impostano la variabile LANG solo su base globale. Questo esempio è per una localizzazione tedesca Unicode:

Codice 3.1: Impostare le impostazioni internazionali di sistema predefinite in /etc/env.d/02locale

LANG="en_GB.UTF-8"

Nel mio Gentoo LANGè impostato in questo file e tutto funziona correttamente ...

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=

Fai attenzione che la parte che hai citato è ok, ma la guida raccomanda anche di impostare una variabile d'ambiente .bashrc, che è sbagliata (vedi la mia risposta e in particolare superuser.com/questions/217431 ).
Gilles 'SO- smetti di essere malvagio' il

Grazie per informazioni così dettagliate ... :) Non ho mai usato quella parte .bashrc - le impostazioni in env.dsono più universali.
pbm,

Inoltre è per sistema anziché per utente. Preferisco mantenere le impostazioni di sistema separate dalle impostazioni dell'utente.
Maciej Piechotka,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.