Quali file di installazione dovrebbero essere usati per impostare le variabili di ambiente con bash?


9

Come ho chiesto e ottenuto risposte qui , e qui , la variabile PATH ha nomi di percorso diversi a seconda di come viene attivata l'app.

  • Quali file di installazione (.bashrc, .profile, ...) dovrebbero essere usati per avere la stessa variabile PATH, indipendentemente da come avvio il software con bash?

Risposte:


15

Tradizionalmente, il posto per definire le variabili di ambiente per utente sui sistemi unix è ~/.profile. Questo file viene letto dalla shell di accesso (ovvero dal programma che viene avviato quando si accede e in cui è possibile digitare i comandi), a condizione che la shell di accesso sia una shell compatibile con Bourne.

Bash è una shell compatibile con Bourne. Quando viene invocato come shell di login, legge ~/.bash_profilese questo file esiste e ~/.profilese ~/.bash_profilenon esiste.

Come regola generale, se si digita la password in modalità testo (ad esempio, su una console di testo o in remoto con ssh), la shell che si ottiene è una shell di accesso.

Tuttavia, se si digita la password in un programma grafico e si accede a un ambiente grafico, questo ignora la normale shell di accesso. La .profilelettura in questo caso dipende dalla configurazione della sessione grafica; ad esempio, varia tra le distribuzioni Linux, tra i display manager e tra gli ambienti desktop. A volte uno dei programmi della catena invoca esplicitamente una shell di login; a volte uno dei programmi legge esplicitamente ~/.profile; e a volte nulla di tutto ciò accade e ~/.profilenon viene letto.

Per dare un esempio della variabilità, per quanto posso dire da una rapida occhiata agli script in questione, su Ubuntu 10.04: se accedi con kdm o lxdm, ~/.bash_profileviene letto se esiste, e ~/.profilealtrimenti; se accedi con gdm, ~/.profileviene letto solo ; se accedi con xdm, ~/.profilenon viene letto.

Tutti i sistemi che conosco forniscono un modo per impostare le variabili di ambiente per utente. Purtroppo non esiste una risposta generale.

Si noti che a volte vengono visualizzati consigli per impostare le variabili di ambiente ~/.bashrco avviare una shell di accesso in ciascun terminale in un ambiente GUI. Entrambe sono cattive idee; uno dei motivi è il problema riscontrato, ovvero che le variabili di ambiente erano disponibili solo nei programmi avviati tramite un terminale e non nei programmi avviati direttamente con un'icona o un menu o una scorciatoia da tastiera.


Alcune applicazioni invocano shell interattive senza accesso, il che significa che .profile e .bash_profile non vengono letti. Se vuoi impostare env vars per quelle applicazioni, un modo per farlo è quello di impostarle in .bashrc anche se questo non dovrebbe essere il posto per esso; vedi github.com/mobile-shell/mosh/issues/102#issuecomment-12503646
William

@William .profileviene letto quando accedi. L'inserimento delle variabili di ambiente .bashrcnon funziona e il tuo scenario dimostra che: l'applicazione (presumibilmente GUI) che esegue questa shell dovrebbe avere le tue variabili di ambiente, ma se le definisci in .bashrc, non lo fa ' t.
Gilles 'SO- smetti di essere malvagio' il

mosh non è una GUI, è un'alternativa a ssh. Non sto difendendo il suo comportamento, sto solo cercando di aiutare gli altri che incontrano lo stesso problema che io e altri abbiamo avuto, come descritto nel problema di Github che ho collegato.
William,

2

La risposta definitiva è nella sezione della pagina man di bash su Bash Startup Files . "Quando viene avviata una shell interattiva che non è una shell di accesso, Bash legge ed esegue i comandi da ~ / .bashrc, se quel file esiste."

Le risposte alle altre tue domande sottolineano che eshell in realtà non viene eseguito bash. Emacs eshellnon lo è bash. Supponendo che eshellsarebbe caricato .bashrcè difettoso come assumere zsho cshcaricare .bashrc. È una shell diversa.

Vedo due opzioni:

  1. Crea il tuo script che prende un elenco di directory e genera il codice bash appropriato bashe il codice elisp per eshell.
  2. Imposta la tua variabile di ambiente ESHELL o SHELL in modo da eseguire effettivamente bash all'interno di emacs. Questo è ciò che faccio. Bash funziona bene in emacs.

Potresti anche essere interessato alla discussione sull'aggiunta di una directory a un percorso senza duplicati .


1

L'impostazione del PATH nel tuo ~ / .profile dovrebbe funzionare. Quel file viene letto all'accesso da ogni shell conforme a POSIX o Bourne che conosco includendo bash. Se si apportano modifiche a quel file, sarà necessario disconnettersi e riconnettersi per rendere effettive le modifiche. Poiché PATH fa parte dell'ambiente del processo di accesso, dovrebbe essere esportato in ogni shell avviata successivamente.

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.