Qual è la differenza tra .bashrc, .bash_profile e .environment?
-
03-07-2019 - |
Domanda
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 esempio MOTD), quale script di avvio è il luogo appropriato per eseguire tali operazioni?
Qual è la differenza tra mettere le cose in .bashrc
, .bash_profile
e .environment
? Ho anche visto 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)?
Soluzione
La differenza principale con i file di configurazione della shell è che alcuni sono letti solo da " login " shell (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, .login
o .profile
o .zlogin
(a seconda della shell che stai usando).
Quindi hai i file di configurazione che sono letti da " interattivo " shell (come in, quelle connesse a un terminale (o pseudo-terminale nel caso, ad esempio, di un emulatore di terminale che gira sotto un sistema a finestre). Questi sono quelli con nomi come .bashrc
, < codice> .tcshrc , .zshrc
, ecc.
bash
complica ciò in quanto .bashrc
è letto solo da una shell che è sia interattivo che non login , così scoprirai che molte persone finiscono per dire al loro .bash_profile
di leggere anche .bashrc
con qualcosa come
[[-r ~ / .bashrc]] & amp; & amp; . ~ / .Bashrc
Altre shell si comportano in modo diverso, ad esempio con zsh
, .zshrc
viene sempre letto per una shell interattiva, sia che si tratti di un 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 retrocompatibile con / bin / sh
, leggerà .profile
se ne esiste uno.
Altri suggerimenti
È 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 capitolo INVOCATION
nel manuale. Dice " I seguenti paragrafi descrivono come bash esegue i suoi file di avvio. & Quot; , penso che sia uno spot-on :) Spiega cosa è un " interattivo " anche la shell.
Bash non conosce .environment
. Sospetto che sia un file della tua distribuzione, per impostare variabili d'ambiente indipendenti dalla shell che guidi.
Classicamente, ~ / .profile
viene utilizzato da Bourne Shell ed è probabilmente supportato da Bash come misura legacy. Ancora una volta, C Shell ha usato ~ / .login
e ~ / .cshrc
- non sono sicuro che Bash li usi affatto.
Il ~ / .bash_profile
verrebbe usato una volta, all'accesso. Lo script ~ / .bashrc
viene letto ogni volta che viene avviata una shell. Questo è analogo a /.cshrc
per C Shell.
Una conseguenza è che le cose in ~ / .bashrc
dovrebbero essere il più leggere (minime) possibile per ridurre il sovraccarico all'avvio di una shell senza 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 accesso. Le cose che ci metti potrebbero essere il tuo PERCORSO e altri importanti variabili di ambiente.
.bashrc è usato per shell non login. Non sono sicuro di cosa significhi. lo so quel RedHat lo esegue ogni volta che si avvia un'altra shell (su per questo utente o semplicemente chiamando di nuovo bash) Potresti voglio mettere alias lì ma di nuovo Non sono sicuro di cosa significhi. io semplicemente ignoralo io.
.profile è l'equivalente di .bash_profile per il root. credo il nome viene cambiato per lasciare altro anche le shell (csh, sh, tcsh) lo usano. (non ne hai bisogno come utente)
C'è anche .bash_logout che viene eseguito alle, sì, buona ipotesi ... disconnettersi. Potresti voler fermare i demoni o addirittura fare un po 'di pulizie. Puoi aggiungi anche "cancella" lì se vuoi cancella lo schermo quando esci.
Inoltre c'è un follow-up completo su ciascuno dei file di configurazione qui
Probabilmente dipendono anche dalla distribuzione, non tutte le distro 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.
Secondo Josh Staiger , Terminal.app di Mac OS X esegue una shell di accesso anziché una shell non di accesso per impostazione predefinita per ogni nuova finestra del terminale, chiamando .bash_profile anziché .bashrc.
Raccomanda:
La maggior parte delle volte non vuoi mantenere due file di configurazione separati per shell di login e non login & # 8212; quando si imposta un PERCORSO, lo si desidera applicare ad entrambi. Puoi risolvere questo problema acquistando .bashrc dal tuo .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 verrà chiamato un computer da una console .bashrc.
Un buon posto da vedere è la pagina man di bash. Qui è una versione online. Cerca " INVOCATION " sezione.
Ho usato le 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 impostare le variabili d'ambiente per funzionare su qualsiasi SO Linux.