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

Ho usato un certo numero di diversi sistemi basati su * nix degli anni, e sembra che ogni aroma di Bash che uso abbia un algoritmo diverso per decidere quali script di avvio eseguire. Ai fini di attività come l’impostazione di variabili d’ambiente e alias e la stampa di messaggi di avvio (ad esempio MOTD), quale script di avvio è il luogo appropriato per fare ciò?

Qual è la differenza tra mettere le cose in .bashrc , .bash_profile e .environment ? Ho visto anche altri file come .login , .bash_login e .profile ; sono mai rilevanti? Quali sono le differenze in cui vengono eseguite le sessioni durante l’accesso fisico, l’accesso remoto tramite ssh e l’apertura di una nuova finestra di terminale? Ci sono differenze significative tra le piattaforms (inclusi Mac OS X (e Terminal.app) e Cygwin Bash)?

La principale differenza con i file di configurazione della shell è che alcuni vengono letti solo dalle shell di “login” (ad esempio quando si effettua il login da un altro host o si accede alla console di testo di un computer unix locale). questi sono quelli chiamati, per esempio, .login o .profile o .zlogin (a seconda della shell che stai usando).

Poi hai i file di configurazione letti da shell “interattive” (come in, quelli collegati a un terminale (o pseudo-terminale nel caso, ad esempio, di un emulatore di terminale che gira sotto un sistema di windows). Questi sono i nomi con come .bashrc , .tcshrc , .zshrc , ecc.

bash rende complicato dal fatto che .bashrc viene letto solo da una shell che è sia intertriggers che non di accesso , quindi troverete che la maggior parte delle persone finisce per dire al proprio .bash_profile di leggere anche .bashrc con qualcosa come

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

Altre shell si comportano in modo diverso – ad esempio con zsh , .zshrc viene sempre letto per una shell intertriggers, indipendentemente dal fatto che si tratti di una login o meno.

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

.profile è semplicemente lo script di accesso nomefile utilizzato originariamente da /bin/sh . bash , essendo generalmente retrocompatibile con /bin/sh , leggerà .profile se ne esiste uno.

È 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 login sono quelle che vengono lette come login (quindi, non vengono eseguite quando si avvia semplicemente xterm, ad esempio). Ci sono altri modi per accedere. Ad esempio utilizzando un X display manager. Questi hanno altri modi per leggere ed esportare variabili d’ambiente al momento del login.

Leggi anche il capitolo INVOCATION nel manuale. Dice “I paragrafi seguenti descrivono come bash esegue i suoi file di avvio.” , penso che sia azzeccato 🙂 Spiega anche cosa sia una shell “intertriggers”.

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

Classicamente, ~/.profile è utilizzato da Bourne Shell ed è probabilmente supportato da Bash come misura legacy. Ancora, ~/.login e ~/.cshrc sono stati usati da C Shell – Non sono sicuro che Bash li usi affatto.

Il ~/.bash_profile verrebbe utilizzato una volta al login. Lo script ~/.bashrc viene letto ogni volta che viene avviata una shell. Questo è analogo a /.cshrc per C Shell.

Una conseguenza è che roba in ~/.bashrc dovrebbe essere il più leggero (minimo) ansible per ridurre il sovraccarico quando si avvia una shell non di login.

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

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

.bash_profile viene eseguito quando si effettua l’accesso. Le cose che hai inserito potrebbero essere il tuo PERCORSO e altre importanti variabili d’ambiente.

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

.profile è l’equivalente di .bash_profile per la radice. Penso che il nome sia cambiato in modo che anche altre shell (csh, sh, tcsh) lo usino. (non ne hai bisogno uno come utente)

C’è anche .bash_logout che esegue, sì, si suppone bene … logout. Potresti voler fermare i demoni o persino fare un po ‘di pulizie. Puoi anche aggiungere “cancella” se vuoi cancellare lo schermo quando esci.

Inoltre c’è un follow-up completo su ciascuno dei file di configurazione qui

Probabilmente sono anche distro.-dipendenti, non tutte le distro scelgono di avere ciascuna configurazione con loro e alcune ne hanno ancora di più. Ma quando hanno lo stesso nome, solitamente includono lo stesso contenuto.

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

Raccomanda:

La maggior parte delle volte non si desidera mantenere due file di configurazione separati per shell di login e non di login: quando si imposta un PATH, si desidera che si applichi a entrambi. Puoi sistemarlo estraendo .bashrc dal tuo file .bash_profile, quindi impostando 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.

Un buon posto per guardare è la pagina man di bash. Ecco una versione online. Cerca la sezione “INVOCATION”.

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

Sembra essere un casino quando devi configurare le variabili di ambiente per funzionare in qualsiasi sistema operativo Linux.