GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è il miglior modo indipendente dalla distribuzione/shell per impostare le variabili d'ambiente?

La domanda dice tutto. Attualmente uso Arch Linux e zsh, ma mi piacerebbe una soluzione che (almeno) funzioni sia su VT che in xterms e anche (si spera, preferibilmente) continuerà a funzionare se cambio distro o shell.

Ho sentito risposte selvaggiamente disparate a questa domanda nei documenti di diverse distribuzioni. Ubuntu dice "usa .pam_environment". Penso che in Arch ciò che consigliano dipenda dalla tua shell. Attualmente metto tutto in .profile e se una shell non lo fa per qualche motivo (ad esempio bash se esiste .bash_profile), lo sovrascrivo cercandolo manualmente. Ma sembra che ci debba essere un modo migliore.

Risposta accettata:

Sfortunatamente non esiste una posizione completamente portatile per impostare le variabili di ambiente. I due file più vicini sono ~/.profile , che è la posizione tradizionale e funziona immediatamente su molte configurazioni, e ~/.pam_environment , un'alternativa moderna, banale ma limitata.

Cosa inserire in ~/.pam_environment

Il file ~/.pam_environment viene letto da tutti i metodi di accesso che utilizzano PAM e che hanno questo file abilitato. Questo copre la maggior parte dei sistemi Linux al giorno d'oggi.

Il principale vantaggio di ~/.pam_environment è che (se abilitato) viene letto prima dell'avvio della shell dell'utente, quindi funziona indipendentemente dal tipo di sessione, dalla shell di accesso e da altre complessità. Funziona anche per accessi non interattivi come su -c somecommand e ssh somecommand .

La principale limitazione di ~/.pam_environment è che puoi inserire solo compiti semplici lì, non una sintassi della shell complessa. La sintassi di questo file è la seguente.

  • I file vengono analizzati riga per riga.
  • Ogni riga deve avere la forma VAR=VALUE dove VAR è composto da lettere, cifre e trattini bassi. La forma alternativa VAR DEFAULT=value consente espansioni di variabili di ambiente utilizzando ${VAR} sintassi e le variabili speciali @{HOME} e @{SHELL} .
  • # avvia un commento, non può apparire in un valore.
  • Se VALUE è racchiuso tra " , quindi VAR viene impostato sulla stringa tra virgolette.
  • $ o @ inserisci un letterale $ o @ e le righe lunghe possono essere divise eseguendo l'escape della nuova riga con un .
  • Se c'è un errore di sintassi come no = o uno spazio bianco senza virgolette, la variabile viene rimossa dall'ambiente.

Quindi, al rialzo, ~/.pam_environment funziona in una vasta gamma di circostanze. Sul lato negativo, non è possibile utilizzare l'output di un comando (ad es. verifica se è presente una directory o un programma) e alcuni caratteri (#" , newline) sono impossibili o fastidiosi da inserire nel valore.

Cosa inserire in ~/.profile

Questo file dovrebbe avere la sintassi sh portatile (POSIX). Usa solo le estensioni ksh o bash (array, [[ … ]] , ecc.) se sai che il tuo sistema ha queste shell come /bin/sh .

Questo file può essere letto da script in applicazioni automatizzate, quindi non dovrebbe chiamare programmi che producono alcun output o chiamare exec . Se vuoi farlo su accessi in modalità testo, fallo solo per shell interattive. Esempio:

case $- in *i*)
  # Display a message if I have new mail
  if mail -e; then echo 'You have new mail'; fi
  # If zsh is available, and this looks like a text-mode login, run zsh
  case "`ps $PPID` " in
    *" login "*)
      if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
  esac
esac

Questo è un esempio di utilizzo di /bin/sh come shell di accesso e passare alla shell preferita. Guarda anche come posso usare bash come shell di accesso quando il mio amministratore di sistema si rifiuta di farmi cambiare

Correlati:come impostare una combinazione di tasti a livello di sistema per attivare un'impostazione specifica delle Preferenze di Sistema ("Tocca per fare clic")?

Quando è ~/.profile non leggi l'accesso non grafico?

Diverse shell di accesso leggono file diversi.

Se la tua shell di accesso è bash

Bash legge ~/.bash_login o ~/.bash_profile se esistono invece di ~/.profile . Inoltre bash non legge ~/.bashrc in una shell di login anche se interattiva. Per non dover mai più ricordare queste stranezze, crea un ~/.bash_profile con le seguenti due righe:

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

Se la tua shell di accesso è zsh

Zsh legge ~/.zprofile e ~/.zlogin , ma non ~/.profile . Zsh ha una sintassi diversa da sh, ma può leggere ~/.profile in modalità di emulazione. Puoi usarlo per il tuo ~/.zprofile :

emulate sh -c '. ~/.profile'

Se la tua shell di accesso è un'altra shell

Non c'è molto che puoi fare lì, a parte l'utilizzo di /bin/sh come shell di accesso e come shell preferita (come il pesce) solo come shell interattiva. Questo è quello che faccio con zsh. Vedi sopra per un esempio di invocare un'altra shell da ~/.profile .

Comandi remoti

Quando si invoca un comando remoto senza passare attraverso una shell interattiva, non tutte le shell leggono un file di avvio.

Ksh legge il file specificato da ENV variabile, se riesci a passarla.

Bash legge ~/.bashrc se non è interattivo (!) e il suo processo padre è chiamato rshd o sshd . Quindi puoi avviare il tuo ~/.bashrc con

if [[ $- != *i* ]]; then
  . ~/.profile
  return
fi

Zsh legge sempre ~/.zshenv quando inizia. Usalo con cautela, poiché viene letto da ogni singola istanza di zsh, anche quando è una subshell in cui hai impostato altre variabili. Se zsh è la tua shell di login e vuoi usarla per impostare le variabili solo per i comandi remoti, usa una guardia:imposta qualche variabile in ~/.profile , come MY_ENVIRONMENT_HAS_BEEN_SET=yes e controlla questa protezione prima di leggere ~/.profile .

if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi

Il caso degli accessi grafici

Molte distribuzioni, display manager e ambienti desktop si organizzano per eseguire ~/.profile , acquistandolo esplicitamente dagli script di avvio o eseguendo una shell di accesso.

Sfortunatamente, non esiste un metodo generale per gestire le combinazioni distro/DM/DE in cui ~/.profile non viene letto.

Se utilizzi una sessione tradizionale avviata da ~/.xsession , questo è il posto in cui dovresti impostare le tue variabili d'ambiente; fallo cercando ~/.profile (cioè . ~/.profile ). Nota che in alcune configurazioni, gli script di avvio dell'ambiente desktop genereranno ~/.profile di nuovo.


Linux
  1. Come impostare/creare variabili di ambiente e shell in Linux

  2. Le variabili non ambientali vengono trasferite alla subshell invocate dalla sostituzione del comando?

  3. Utilizzo delle variabili di ambiente nei file Tmux.conf?

  4. Qual è il modo migliore per masterizzare un file video su un DVD?

  5. C'è un modo per cambiare le variabili d'ambiente di un altro processo in Unix?

Come impostare la variabile d'ambiente in Windows

Come impostare le variabili d'ambiente in MacOS

Come impostare ed elencare le variabili di ambiente in Linux

E la migliore distribuzione del 2019 è...

Come impostare e annullare l'impostazione delle variabili di ambiente su Linux

L'esecuzione di crontab non ha le stesse variabili di ambiente dell'utente in esecuzione