Le persone ottengono bash_profile da bashrc anziché viceversa a causa della convenzione locale .
Tutta l'opinione che ho letto su come si configurano i propri file di avvio in 04
si basa principalmente sulla convenzione locale. La convenzione locale di solito non menziona il quadro generale in quanto non parla molto del caso non di accesso e non interattivo. La cosa divertente è che ho guardato, ma raramente vedo qualcuno menzionare 17
in tutti i loro discorsi sul perché mettere le variabili in un file di avvio rispetto all'altro. In effetti, non ho sentito un commento dire:"/bin/sh è lì per un motivo. Bash emula la shell Bourne originale, /bin/sh, quando viene invocata come tale. " Per prima cosa, e sto divagando leggermente, questo caso è importante per le persone che lavorano con la shell non solo in modo interattivo, ma che forniscono servizi non interattivi, senza login (non presidiati o sfondo ) 29
script che richiedono un'elaborazione shell minima, ovvero l'elaborazione in background non richiede sottigliezze come prompt colorati, cronologia e sostituzione dei comandi, una variabile $TERM correttamente definita, ecc.
Inoltre e rispetto a 36
, quello che di solito vedo sono persone che creano percorsi di ricerca minimi o chiamano programmi pienamente qualificati e non sanno come gestire l'output non connesso a un terminale (cioè il 46
non interattivo e senza login o 53
caso) quando si lavora con il loro 60
script. Questo di solito è dovuto al fatto che una buona comprensione della sequenza di avvio della shell non è completamente compresa, il che porta un utente a implementare i propri file di avvio in modo incoerente o incoerente con le convenzioni già stabilite nel 76 file di avvio.
Elaborando, la configurazione fatta dalla convenzione locale è strutturata in quella particolare installazione e 80
della shell File. Se si esamina il 92
di qualsiasi installazione UNIX file, che vengono richiamati come parte di un tipico 105
sequenza di startup, allora si dovrebbe creare la propria startup in modo complementare alla convenzione stabilita in quei 112
file di avvio.
Il Linux Documentation Project afferma:
/etc/skel/ I file predefiniti per ogni nuovo utente sono memorizzati in questa directory. Ogni volta che viene aggiunto un nuovo utente, questi file scheletro vengono copiati nella loro home directory. Un sistema medio avrebbe:file .alias, .bash_profile, .bashrc e .cshrc. Altri file sono lasciati all'amministratore di sistema.
Sebbene il 125
manual non menziona questi file che si trovano comunemente nel 132
directory in modo esplicito, da quello che ricordo, SunOS, Solaris, RedHat, Ubuntu, HP-UX, umips e Ultrix hanno 143
file per modellare i file di avvio della shell di un utente dopo. OSX chiaramente no:sto usando OSX 10.9.1 in questo momento. Sfortunatamente, OSX non ti dà molto su come impostare le cose in termini di convenzione, ma poiché OSX è un derivato di BSD, ho semplicemente usato un altro derivato di BSD e ho modellato il mio 158
sequenza di avvio successiva, adattandola per adattarla alle convenzioni locali utilizzate in OSX 10.9.1 166
file di avvio.
Un punto importante che è stato menzionato in un commento parallelo è che per OSX, la convenzione è di avviare ogni nuovo Terminale come una shell di login interattiva. Questo è davvero l'impostazione predefinita in OSX. Non ci sono problemi con questa convenzione fintanto che gli utenti di un'installazione sono coerenti. Il comportamento predefinito per il Terminale su OSX può essere modificato per conformarsi alle convenzioni di avvio della shell di altre distribuzioni UNIX apportando la seguente modifica alle preferenze del Terminale , in particolare, cambia l'impostazione, 175
per emettere il 184
comando:
Con tutto ciò come sfondo o introduzione, passerò al mio miglior consiglio , per quello che vale.
Il mio miglior consiglio:
Esamina i file che gli amministratori della tua distribuzione UNIX hanno inserito. Inizia con le seguenti posizioni, se esistono. Non dimenticare di utilizzare il 198
comando, perché alcuni dei file iniziano con un punto. Guarda come questi file vengono utilizzati durante l'avvio e guarda come i tuoi file di avvio interagiscono con essi:
/etc/bashrc
/etc/profile
/etc/skel/.bash_logout
/etc/skel/.bashrc
/etc/bash.bashrc
/etc/bash_completion
Guarda nel 207
manuale per l'invocazione e la sequenza di avvio. È tutto strutturato molto bene.
Con tutto ciò come avvertimento - ecco come ho fatto le cose sulla mia installazione OSX 10.9.1 - Altre distribuzioni UNIX SARANNO diverse, ma ciò che viene presentato di seguito dovrebbe funzionare sulla maggior parte se non su tutte le distribuzioni UNIX, ma usa quelle altre distribuzioni UNIX ' convenzione come guida per adattare quanto segue ai propri scopi:
.profilo
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists. Note, however, that we will have a ~/.bash_profile and it
# will simply source this file as a matter of course.
# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.
# From here on out, I basically set up my PATH, LD_LIBRARY_PATH, and anything else I'd like
# global to running programs and how those programs find their libraries. This is shared by
# `cron`, so we really don't want interactive stuff, here. Also, I setup my environments
# for brew, macports, and fink here, essentially with setting PATH, and invocation of those
# package initialization file as in:
# Brew and locally compiled stuff:
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH
# The following line puts gnu utilities without the prefix "g" in the path
# i.e. tar/gtar:
export PATH=$PATH:/usr/local/Cellar/coreutils/8.21/libexec/gnubin
# MacPorts shoves stuff in /opt, so to get at that stuff...
export PATH=/opt/local/bin:$PATH
export PATH=/opt/local/sbin:$PATH
# Set up for using Fink, which lives in /sw:
[ -e /sw/bin/init.sh ] && . /sw/bin/init.sh
# My stuff:
export PATH=~/perl:$PATH
export PATH=~/bin:$PATH
export PATH=.:$PATH
.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
# From here on out, I put in things that are meaningful to interactive shells, like aliases,
# `shopt` invocations, HISTORY control, terminal characteristics, PROMPT, etc.
.bash_profile
# ~/.bash_profile: executed by the command interpreter for login shells.
# Because of this file's existence, neither ~/.bash_login nor ~/.profile
# will be sourced.
# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.
# Because ~/.profile isn't invoked if this files exists,
# we must source ~/.profile to get its settings:
if [ -r ~/.profile ]; then . ~/.profile; fi
# The following sources ~/.bashrc in the interactive login case,
# because .bashrc isn't sourced for interactive login shells:
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
# I'm still trying to wrap my head about what to put here. A suggestion
# would be to put all the `bash` prompt coloring sequence functions as
# described on http://brettterpstra.com/2009/11/17/my-new-favorite-bash-prompt/
Quindi questi sono i miei due centesimi. Tieni presente che i miei esempi hanno cercato di mostrare il percorso di controllo attraverso i file di avvio ed evitare ciò che le convenzioni di un particolare sito potrebbero imporre.
perché mettiamo tutto in bash_profile in primo luogo?
.profile è stato originariamente utilizzato da /bin/sh, l'utilizzo di .profile consente la retrocompatibilità.
A meno che tu non stia usando mac, tutto non viene inserito in bash_profile. È messo in bashrc
non avrebbe più senso ed essere più coerente con la comunità Linux mettere tutto in bashrc e avere il sorgente bash_profile?
È comune inserire le informazioni di sistema nella shell che viene caricata quando ci si connette alla macchina (tempo di attività, pacchetti che necessitano di aggiornamento, temperatura della cpu ect...). Se bashrc provenisse da bash_profile, vedresti tutte queste informazioni ogni volta che apri una nuova shell.
In Unix:
.bash_profile viene caricato dalle shell di login
.bashrc viene caricato da shell interattive
Ad eccezione di Mac, che carica la shell di login per ogni nuovo terminale (interattivo o meno)
Risorse aggiuntive
differenza tra bashrc e bash-profile
Dove sono specificate le variabili di ambiente
[...] Sono confuso perché preferire bash_profile è lo standard?
Chi dice che è lo standard? Lo stesso manuale di Bash ha questo da dire sull'argomento:
Quindi, in genere, il tuo ~/.bash_profile contiene la riga
if [ -f ~/.bashrc ]; poi . ~/.bashrc; fi
dopo (o prima) qualsiasi inizializzazione specifica dell'accesso.