Qual è la differenza tra .bashrc, .bash_profile e .environment?


130

Ho usato diversi sistemi basati su * nix negli anni, e sembra che ogni tipo di Bash che uso abbia un algoritmo diverso per decidere quali script di avvio eseguire. Ai fini di attività come l'impostazione di variabili di ambiente e alias e la stampa di messaggi di avvio (ad es. MOTD), quale script di avvio è il luogo appropriato per eseguire queste operazioni?

Qual è la differenza tra mettere le cose in .bashrc, .bash_profilee .environment? Ho visto anche altri file come .login, .bash_login, e .profile; sono mai rilevanti? Quali sono le differenze in cui vengono eseguiti quando si accede fisicamente, si accede in remoto tramite ssh e si apre una nuova finestra del terminale? Ci sono differenze significative tra le piattaforme (incluso Mac OS X (e il suo Terminal.app) e Cygwin Bash)?

Risposte:


73

La differenza principale con i file di configurazione della shell è che alcuni vengono letti solo dalle shell "login" (ad es. Quando si accede da un altro host o si accede alla console di testo di una macchina unix locale). questi sono quelli chiamati, diciamo, .loginoppure .profileoppure .zlogin(a seconda della shell che state usando).

Quindi hai i file di configurazione che vengono letti da shell "interattive" (come in, quelli collegati a un terminale (o pseudo-terminale nel caso, diciamo, di un emulatore di terminale che gira sotto un sistema a finestre). Questi sono quelli con nomi come .bashrc, .tcshrc, .zshrc, etc.

bashcomplica questo in quanto .bashrcviene letto solo da una shell che è sia interattiva che non di accesso , quindi scoprirai che molte persone finiscono per dire loro .bash_profiledi leggere anche .bashrccon qualcosa come

[[ -r ~/.bashrc ]] && . ~/.bashrc

Altre shell si comportano in modo diverso - ad es. Con zsh, .zshrcviene sempre letta per una shell interattiva, che si tratti di una login o meno.

La pagina di manuale per bash spiega le circostanze in cui viene letto ogni file. Sì, il comportamento è generalmente coerente tra le macchine.

.profileè semplicemente il nome file dello script di accesso originariamente utilizzato da /bin/sh. bash, essendo generalmente compatibile con le versioni precedenti /bin/sh, leggerà .profilese ne esiste una.


48

È semplice. È spiegato in man bash:

/bin/bash
       The bash executable
/etc/profile
       The systemwide initialization file, executed for login shells
~/.bash_profile
       The personal initialization file, executed for login shells
~/.bashrc
       The individual per-interactive-shell startup file
~/.bash_logout
       The individual login shell cleanup file, executed when a login shell exits
~/.inputrc
       Individual readline initialization file

Le shell di accesso sono quelle che vengono lette quando si accede (quindi, non vengono eseguite quando si avvia semplicemente xterm, ad esempio). Esistono altri modi per accedere. Ad esempio utilizzando un X display manager. Questi hanno altri modi per leggere ed esportare le variabili di ambiente al momento dell'accesso.

Leggi anche il INVOCATIONcapitolo del manuale. Dice "I seguenti paragrafi descrivono come bash esegue i suoi file di avvio." , penso che sia perfetto :) Spiega cos'è anche una shell "interattiva".

Bash non lo sa .environment. Sospetto che sia un file della tua distribuzione, per impostare variabili d'ambiente indipendenti dalla shell che guidi.


1
Potresti aggiungere /etc/bashrca pieno la risposta?
Nemoden,

9

Classicamente, ~/.profileviene utilizzato da Bourne Shell ed è probabilmente supportato da Bash come misura legacy. Ancora una volta, ~/.logine ~/.cshrcsono stati usati da C Shell - Non sono sicuro che Bash li usi affatto.

Il ~/.bash_profilesarebbe usato una volta, al login. Lo ~/.bashrcscript viene letto ogni volta che viene avviata una shell. Questo è analogo a /.cshrcper la Shell C.

Una conseguenza è che le cose ~/.bashrcdovrebbero essere il più leggere (minime) possibile per ridurre il sovraccarico quando si avvia una shell senza login.

Credo che il ~/.environmentfile sia un file di compatibilità per Korn Shell.


7

Ho trovato informazioni su .bashrc e .bash_profile qui per riassumere:

.bash_profile viene eseguito quando accedi. Le cose che inserisci potrebbero essere il tuo PERCORSO e altre importanti variabili d'ambiente.

.bashrc è usato per shell non login. Non sono sicuro di cosa significhi. So che RedHat lo esegue ogni volta che avvii un'altra shell (su per questo utente o semplicemente chiamando di nuovo bash) Potresti voler inserire degli alias lì, ma di nuovo non sono sicuro di cosa significhi. Lo ignoro da solo.

.profile è l'equivalente di .bash_profile per la radice. Penso che il nome sia cambiato per permettere ad altre shell (csh, sh, tcsh) di usarlo. (non ne hai bisogno come utente)

C'è anche .bash_logout che viene eseguito, sì, indovina ... logout. Potresti voler fermare i demoni o persino fare un po 'di pulizie. Puoi anche aggiungere "cancella" lì se vuoi cancellare lo schermo quando esci.

Inoltre c'è un seguito completo su ciascuno dei file di configurazione qui

Probabilmente sono anche dipendenti dalla distribuzione, non tutte le distribuzioni scelgono di avere ciascuna configurazione con sé e alcune ne hanno anche di più. Ma quando hanno lo stesso nome, di solito includono lo stesso contenuto.


4

Secondo Josh Staiger , Terminal.app di Mac OS X esegue effettivamente una shell di accesso anziché una shell di non accesso per impostazione predefinita per ogni nuova finestra del terminale, chiamando .bash_profile anziché .bashrc.

Egli raccomanda:

Il più delle volte non si desidera mantenere due file di configurazione separati per le shell di accesso e non di accesso: quando si imposta un PERCORSO, si desidera che si applichi a entrambi. Puoi risolvere questo problema acquistando .bashrc dal tuo file .bash_profile, quindi inserendo PATH e le impostazioni comuni in .bashrc.

Per fare ciò, aggiungi le seguenti righe a .bash_profile:

if [ -f ~/.bashrc ]; then 
    source ~/.bashrc 
fi

Ora quando accedi al tuo computer da una console, verrà chiamato .bashrc.


2

Un buon posto da vedere è la pagina man di bash. Ecco una versione online. Cerca la sezione "INVOCAZIONE".


0

Ho usato distribuzioni della famiglia Debian che sembrano eseguire .profile, ma non .bash_profile, mentre i derivati ​​RHEL eseguono .bash_profileprima .profile.

Sembra essere un casino quando devi impostare le variabili d'ambiente per funzionare su qualsiasi SO Linux.

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.