Perché .bashrc non viene eseguito automaticamente?


202

Ho inserito alcuni comandi alias nel mio .bashrcfile, in modo che possano essere caricati ogni volta che apro una nuova finestra Terminale. Eppure questo non succede.

Devo selezionare run script:nel Terminale> Preferenze> " MyDefaultTheme "> Prefpane Shell e aggiungere: source .bashrc && clearaffinché funzioni ...

Sembra strano dal momento che molti tutorial dicono solo che devi solo aggiungere al .bashrcfile e tutto va bene.

Nota che non corro bashquando utilizzo il terminale, mi piace l'altro (predefinito) uno (non so cosa sia) meglio, perché mi mostra dove sono sempre ad es.

>>d54c6b47b:~ romeo$

invece di:

>>bash$

In bash tutto viene caricato come dovrebbe essere.

Quindi la mia domanda è: perché il mio .bashrcfile non è stato caricato automaticamente e ho dovuto aggiungere l'opzione per chiamarlo ogni volta?

Inoltre alcuni tutorial mi hanno detto di fare qualcosa del tipo:

$alias la=’ls -la >> ~/.bashrc

che dovrebbe scrivere l'alias sul mio .bashrc, non funziona neanche ...

Nota che sono un principiante UNIX, quindi sii gentile.


Penso che questo sia molto vicino a apple.stackexchange.com/questions/7984/… .
Boehj,

@boehj bene menziona "non si carica .bashrc" ma questo è tutto.
Jari Keinänen,

OK, scusa se ho confuso le cose qui.
Boehj,

Probabilmente ti piace csh(o un'altra variante) meglio. Ma dovresti sapere che >>bash$può essere cambiato :)
vol7ron,

Se vuoi che i comandi vengano eseguiti onload , crea .profilenella tua home directory
Kolob Canyon il

Risposte:


94

Inseriscilo nel tuo .profilefile dalla tua home directory e dovrebbe funzionare al prossimo avvio di una nuova shell o dopo l'esecuzionesource ~/.profile

Questo collegamento indica chiaramente l'ordine in cui i file di avvio vengono letti e caricati dalla shell: http://hayne.net/MacDev/Notes/unixFAQ.html#shellStartup


accettato questo perché ha una soluzione (ed è stato il primo di due post quasi identici).
romeov

37
Down-votato. Mi sconsiglio di seguire questo consiglio. Il problema è che Terminal crea shell di accesso e le shell di accesso Bash eseguono solo lo script di avvio dell'accesso, non ~/.bashrc. Tuttavia, la soluzione non è semplicemente quella di posizionare il .bashrccontenuto nel file di avvio dell'accesso, poiché questi due file sono destinati a eseguire diversi tipi di installazione. Invece, la configurazione canonica di Bash è di avere la tua ~/.bash_profilefonte ~/.bashrcin un punto appropriato dello script (di solito l'ultimo).
Chris Page

Non vedo nessun altro post identico che dice solo messo nel file sh
Mark

218

Ci sono stato, l'ho fatto. Ciò di cui sono venuto a conoscenza, OS X non legge il .bashrcfile all'avvio di bash. Invece, legge i seguenti file (nel seguente ordine):

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

Vedi anche il commento informativo e utile di Chris Johnsen :

Per impostazione predefinita, Terminal avvia la shell tramite /usr/bin/login, il che rende la shell una shell di accesso. Su ogni piattaforma (non solo Mac OS X) bash non usa .bashrcper le shell di login (solo /etc/profilee il primo di .bash_profile, .bash_login, .profileche esiste ed è leggibile). Questo è il motivo per cui "mettere source ~/.bashrcnel tuo .bash_profile" è un consiglio standard

Io di solito appena messo le cose che avrei normalmente messo in ~/.bashrca ~/.profile- ha lavorato fino ad ora come un fascino.


38
Per impostazione predefinita, Terminal avvia la shell tramite /usr/bin/login, il che rende la shell una shell di accesso. Su ogni piattaforma (non solo Mac OS X) bash non usa .bashrcper le shell di login (solo /etc/profilee il primo di .bash_profile, .bash_login, .profileche esiste ed è leggibile). Questo è il motivo per cui "mettere source ~/.bashrcnel tuo .bash_profile" è un consiglio standard.
Chris Johnsen,

5
Ri "Di solito metto solo le cose che normalmente metterei in ~ / .bashrc a ~ / .profile": Per la massima compatibilità, ti consiglio di seguire i consigli di Chris Johnsen e posizionare tutto ciò che vuoi applicare alle shell non di accesso in ~ / .bashrc e aggiungi "source ~ / .bashrc" al tuo ~ / .bash_profile per eseguirlo per le shell di login. Altrimenti, non funzionerà per le shell secondarie, o se il Terminale cambia per creare shell non di accesso, o se si utilizza mai xterm o un altro programma terminale che crea shell non di accesso per impostazione predefinita, o se si desidera utilizzare il stessa configurazione su un altro sistema operativo.
Chris Pagina

4
In una nota correlata, su Mac OS X dovresti considerare di avere ~ / .bashrc in esecuzione / etc / bashrc per raccogliere comportamenti globali. In particolare, c'è codice in / etc / bashrc per aggiornare la directory di lavoro ad ogni prompt, che è ciò che consente a Terminal di visualizzare l'icona del proxy, creare nuovi terminali nella stessa directory e ripristinare la directory di lavoro per Riprendi e Gruppi di finestre.
Chris Pagina

Per me, l'approvvigionamento di .bashrc da .bash_profile non ha funzionato. Ma il sourcing .bashrc / .bash_profile ha funzionato da .profile.
Ken Russell,

2
Bella risposta ma un po 'male informata. Credo che i carichi di terminale bash solo uno dei ~/.bash_profile, ~/.profile, ~/.bash_login, non tutta la loro. È possibile eseguire un semplice test creando i 3 file. Sembra che il terminale bash ha la preferenza di ~/.bash_profile> ~/.bash_login> ~/.profile. Se esiste qualcuno, quelli con meno preferenze vengono saltati. Ecco perché a volte si consiglia di fonte anche ~/.profilein ~/.bash_profile.
neurite,

25

Ho inserito tutto ~/.bashrce solo source ~/.bashrcin .profile.

Ciò consente alle sessioni screen e xterm (e immagino che tmux) di ereditare il mio ambiente quando vengono eseguite solo sessioni non di accesso .bashrc, mentre solo le sessioni di accesso (ad es. Terminale o iTerm) .profile.


1
Questo è il mio approccio In questo modo posso mantenere un .bashrc che funziona su entrambi i sistemi ... e posso mettere qualsiasi roba specifica per mac o roba come alias che sono solo per lavoro (dove uso maggiormente il mac) nel mio file .bash_profile.
Michael Durrant,

2
Si noti che .profileè comune a diverse shell e dovrebbe contenere solo codice sh compatibile POSIX. Se la fonte .bashrccontiene probabilmente codice specifico di Bash (l'esistenza del .bashrcfile è specifica di Bash). Mi consiglia di rinominare il tuo .profilea .bash_profilequanto si sta utilizzando in un modo specifico per Bash. Oppure, inserisci il codice generico .profilee crea un .bash_profiletale sorgente .profilee .bashrc.
Chris Page

19

Esistono due scenari:

  1. Stai usando Linux
  2. Stai utilizzando Mac Os X.

Per entrambi si desidera eseguire il source ~/.bashrco il sourcing nel profilo che viene caricato all'avvio della shell per il terminale.


LINUX

In Linux, ~/.profileè automaticamente sorgente nella tua shell all'avvio. Quindi, se vai al tuo terminale e digiti cd ~; ls -A, vedrai tutti i tuoi file e directory nella tua home directory ( /home/usrname/). Dovresti vedere un file chiamato .profile. Questo è il file che viene automaticamente "originato" all'avvio del terminale.

Se vuoi aggiungere alias e funzioni a ~/.bashrc(che è quello che faccio), allora dovresti (all'interno di ~/.profileaggiungere un'istruzione if che controlla se ~/.bashrcè un file non vuoto e quindi sorgente.

Per verificare se lo fai ~/.profilegià, inserisci nano ~/.profile. Questo lo aprirà in un editor di testo (puoi usare gedit se sai di averlo o anche vim se sai come usarlo). Potresti ottenere un file di testo vuoto (non dovresti), ma se lo fai semplicemente procedi. Se non vedi una riga da nessuna parte che dice source ~/.bashrc, inserisci le seguenti righe da qualche parte (mettila in un posto ragionevole come alla fine o all'inizio e non nel mezzo di un'istruzione if):

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

Questo controlla se ~/.bashrcè un file non vuoto (con if [ -s ~/.bashrc ]) e se è tale, lo genera. Abbastanza semplice. Ora puoi aggiungere qualsiasi alias, funzione, variabile, ecc ~/.bashrc. Validi a .


MAC OS X

Per impostazione predefinita, le fonti Max OS X ~/.bash_profile. Per poter aggiungere cose ~/.bashrc(che è, di nuovo, ciò che faccio anche in OS X), segui la stessa procedura di Linux. Nel terminale entra cd ~; nano .bash_profile. Cerca una riga che dice source ~/.bashrce se non è presente aggiungi l'istruzione if sopra ( if [ -s ~/.bashrc ]; then source ~/.bashrc; fi).


APPUNTI

Quando scrivi un'istruzione if, assicurati di lasciare spazi tra praticamente tutto (ad esempio if [ -s ~/.bashrc]; then echo "found"; finon funziona perché non c'è spazio tra gli spazi ~/.bashrce ]- l'interprete penserà che questa sia una parola).

Se vuoi capire come controllare meglio le cose in un'istruzione if, vai al terminale e inserisci man \[; questo essenzialmente ti dà il declino di un'istruzione if. Ad esempio, if [ -f /path/to/file ]; then echo "it's a file"; else echo "not a file"; ficontrolla se /path/to/fileè un file e se viene stampato su stdout di conseguenza. Faccio sempre riferimento anche a questo per un riferimento più semplice e rapido: 7.2. Operatori di test dei file .

Spero che questo possa essere d'aiuto. Ricordo quanto ero confuso quando ho iniziato tutta questa roba (che non era molto tempo fa); quindi, buona fortuna con i tuoi futuri sforzi UNIX!


Su Linux, .profileviene fornito solo se la shell è una shell di accesso, altrimenti .bashrcviene
fornita

11

Il sourcing .profile in .bash_profile l'ha fatto per me

echo 'source ~/.profile' >> ~/.bash_profile

1
Il sourcing .profile in .bash_profile è un'ottima cosa da fare, ma questo da solo non farebbe funzionare .bashrc con shell di login. Il tuo .profile deve aver già ricevuto .bashrc, il che potrebbe causare problemi se usi mai una shell diversa da bash. La maggior parte degli utenti Mac non lo farà mai, ma se lo fai per qualche motivo, ricorda questo. :)
Terry N

Per espandere ciò che ha detto @TerryN: assicurati di provenire .bashrcda te .bash_profilee non da .profile. .bash_profileè specifico di Bash e dovrebbe procurarsi gli altri due.
Chris Page

6

Ho scoperto che dopo aver installato rvm (auto-installer, nessuna modifica manuale) aveva creato un ~/.bash_loginfile per sé, dove in precedenza non ne avevo mai avuto uno.

Tuttavia, questo significa che i miei ~/.profilesetup e alias non sono più stati caricati! Molte scorciatoie sono scomparse. Ho pensato che correvano in sequenza, non esclusivamente: - /

Ho aggiunto

. ~/.profile 

per ~/.bash_loginincatenare le cose come mi aspettavo.


+1, questa è la situazione che ho avuto. Ho scoperto che .bash_login o .bash_profile impediranno l'esecuzione di .profile ... Non ho idea del motivo per cui bash sente la necessità di avere così tanti file di avvio in conflitto.
RichVel

.profileè comune a diverse shell e dovrebbe contenere solo codice sh compatibile POSIX. .bash_profileè specifico di Bash e può contenere codice specifico di Bash. In generale, se stai usando Bash dovresti preferire a .bash_profilemeno che tu non stia attento a garantire che il tuo codice di avvio non contenga nulla che dipende da Bash. Qualunque programma creato .bash_loginprobabilmente lo ha fatto perché contiene codice specifico di Bash, ma avrebbe dovuto includere il codice all'origine .profilese esiste.
Chris Page

3

Mettendo...

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

... in ~/.bashrc, e quindi sorgente ~/.bashrcnel mio ~/.bash_profile non ha funzionato per il programma Terminal che viene installato.

Ma poi sono andato al menu a discesa Modifica> Preferenze profilo , scheda Titolo e comando e ho selezionato Esegui comando come shell di accesso dalla sezione comandi di quella pagina.

Dopo averlo fatto, l'avvio di un nuovo terminale mostra il risultato desiderato quando scrivo

 type rvm|head -1

cioè "rvm è una funzione". Non lo ha fatto fino a quando non ho apportato questa modifica, ed è l'unica modifica che ho apportato dopo .bash_profilee le .bashrcmodifiche descritte in altre risposte qui.


2

Prima di tutto, lascia che ti dica che ~/.bashrcè il file che viene eseguito ogni volta che viene richiamata una seconda shell (ad esempio quando si esegue uno script di shell) e ~/.profileviene chiamata ad ogni accesso.

Quindi ti consiglio di scrivere il . ~/.bashrccomando nel tuo ~/.profilefile e questo comando eseguirà il file bashrc ogni volta che accedi.


quando .profile viene eseguito all'accesso, esegue automaticamente il file .bashrc.
Arun Rana,

così .bashrc viene eseguito indirettamente ad ogni accesso
arun rana

1
bashrc è per shell senza login. bash_profile / bash_login / profile / qualunque altra cosa sia per le shell di login. Questa è una fonte di un'enorme quantità di controversie, che coinvolge ciò che è e non è una shell di accesso (una schermata / sessione tmux per esempio, un terminale all'interno di un ambiente desktop, ecc.). Non è necessariamente la "seconda shell". È una questione di entrata nella shell.
Jason Salaz,

3
Se mai usi una shell che non è Bash, fare ciò che descrivi potrebbe causare problemi. .profile si applica a tutte le shell e .bashrc potrebbe contenere un linguaggio che alcune altre shell non comprendono. Invece di .profile, inserisci ciò che hai scritto in .bash_profile. (Inoltre, rendi la prima cosa che .bash_profile sia "source .profile".)
Terry N

1

Ho riscontrato lo stesso problema dopo aver installato rbenv sul mio server remoto (Digital Ocean) Ubuntu 16.04.

In qualche modo ha creato ~/.bash_profile. È lo stesso ~/.bashrcsu un sistema OS X.

E Ubuntu ha iniziato a leggere solo ~/.bash_profile, ma non ~/.bashrccome dovrebbe.

Quindi ho appena eseguito il backup dei miei dati ~/.bash_profilecon questo:

mv ~/.bash_profile ~/.bash_profile.bak

E ribattezzato il vecchio ~/.bashrcin~/.bash_profile

mv ~/.bashrc ~/.bash_profile

Ha funzionato per me. Dopo il mio login ssh ho tutto caricato ~/.bashrc.


0

Nel caso in cui questo potrebbe aiutare chiunque altro ...

Assicurati di modificare il .bashrcfile giusto per l'utente giusto. Ho avuto un problema simile usando Vagrant. Dopo aver eseguito il vagrant sshmio .bashrcfile non veniva eseguito. La soluzione era semplice in quanto pensavo che Vagrant effettuasse l'accesso con l'utente di nome Vagrant e in realtà stavo effettuando l'accesso come un altro utente. Quindi stavo modificando il .bashrcfile sbagliato . Dopo aver modificato il .bashrcfile corretto, i miei alias sono stati riconosciuti.


-1

A proposito, se hai attivato ZSH, sostituisce bash!

Quindi tutti quei ~/.bashrcfile non vengono caricati.

Devi invece impostare i tuoi alias ~/.zshrc.


-2

Per mantenere il login in stile OSX .profilee supportare il normale comportamento bash .bashrcè possibile utilizzare un .bashrcfile se si passa da nix normale a OSX fornendo un collegamento simbolico al proprio .bashrcfile chiamato .bash_profile. Assicurati solo che questo file non esista già prima di provarlo, ma è così che lo faccio.

ln -s .bashrc .bash_profile

Effettuando questo collegamento tra 2 differenti script di inizializzazione della shell si sta perdendo una necessaria separazione di funzioni. Un giorno o l'altro avrai bisogno di un'inizializzazione a livello di sessione ( .bash_profile) e di un'inizializzazione diversa a ogni livello di shell ( .bashrc).
dan

-2

/ etc / bashrc è per profili globali su sistemi mac. Puoi aggiungere: alias ls = "ls -G" all'inizio di questo file e, per fortuna, tutti avranno file e cartelle colorati sul sistema, quindi non dovrai impostare nulla in più per ogni singolo utente. Noterai anche insieme a "sudo su -" per eseguire il root da te stesso, avrai comunque file e cartelle colorati senza ulteriori mal di testa.

Un altro suggerimento divertente: quando si utilizza Iterm2 di mac, l'importazione dei profili colore renderà la colorazione di file e cartelle immediatamente in base alla propria combinazione di colori dopo aver impostato questa opzione "/ etc / bashrc".

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.