Comprensione di .bashrc e .bash_profile


26

Su un server quando accedo come root vedo .bashrc(Ubuntu 10.10).

Sul mio Mac ho un .bash_profile

Ubuntu ha sempre solo un .bashrcfile e non .bash_profile? (Sono solo confuso, quindi chiedendo, mi rendo conto che sono diversi o / s ma forse c'è una relazione in qualche modo?)

Sul mio server, voglio creare un alias, devo inserirlo .bashrc?

Cosa succede se desidero applicare questo alias in modo che tutti gli utenti possano utilizzarlo?


1
possibilmente duplicato di: askubuntu.com/questions/1528/bashrc-or-bash-profile - ti consiglierei di cambiare la tua domanda per chiedere semplicemente dove posizionare gli alias a livello globale.

Risposte:


39

Gli alias Bash dovrebbero andare nei file .bash_aliaseso .bashrcnelle singole directory home. Se devi creare alias bash globali, possono entrare /etc/bash.bashrc, ma è spesso meglio semplicemente aggiungerli ai file .bash_aliaseso .bashrcin /etc/skelmodo che siano ereditati dagli utenti appena creati.

E ' praticamente sempre sbagliato a definire un alias in a .profile, .bash_profileo /etc/profile.

Per capire perché, è necessario capire in quali circostanze vengono eseguiti i comandi di ciascuno di questi file . Ci sono idee sbagliate su questo, che rivolgo di seguito.

Anche se desideri definire alias per più utenti, dovresti avere familiarità con il modo in cui sono definiti per i singoli utenti, in modo da poter decidere il metodo migliore per fare ciò di cui hai bisogno.

Alias ​​per singoli utenti

Soprattutto se si utilizza una GUI, la maggior parte delle shell interattive sono probabilmente shell non di accesso . Anche se non usi mai una GUI, probabilmente usi comunque shell non di accesso con una certa frequenza. Vorrai che i tuoi alias funzionino in queste shell.

Soprattutto se si accede in modo non grafico in una console virtuale o tramite SSH , è probabile che si utilizzino le shell di accesso qualche volta. Quindi vorrai che i tuoi alias funzionino anche con shell di login interattive.

Quando viene avviata una shell interattiva, senza accesso , questa si trova .bashrcnella home directory dell'utente. Di default in Ubuntu, ogni utente .bashrcstesso si procura .bash_aliases, se esiste.

  • Per sorgente un file è quello di provocare il suo contenuto da eseguire nella corrente shell. Le modifiche all'ambiente shell effettuate in un file di origine persistono anche dopo l'esecuzione di tutti i comandi nel file.

Leggere i commenti nel default di Ubuntu .bashrcrivela che è ufficialmente inteso che gli alias entrino .bashrco .bash_aliases. .bashrccontiene già alcune definizioni di alias (esegui grep '^[[:blank:]]*alias' ~/.bashrcper vederle) e fornisce consigli espliciti su dove inserire nuove definizioni di questo tipo:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Ma per quanto riguarda le shell di login interattive ? Invece di .bashrc, sorgente shell di accesso .profile.

  • ... A meno che non .bash_loginesista, si ottiene invece.
  • ... A meno che non .bash_profileesista, si ottiene invece.

Tuttavia, la buona notizia è che di default in Ubuntu, comandi in .bashrcsaranno anche eseguite in shell di login interattiva , perché il default .profilecontrolla se la shell bash corrente è (e se .bashrcesiste), e in tal caso, le fonti .bashrc:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Suggerisco agli utenti di definire nuovi alias bash .bash_aliasesnelle loro directory home (creandolo se non esiste già). Questo è un modo particolarmente pulito e semplice per rendere permanenti le definizioni di alias a livello di utente.

Gli alias non devono essere definiti.profile perché rimarrebbero indefiniti nelle shell non di accesso. A differenza della maggior parte dell'ambiente di una shell bash, gli alias non vengono esportati in shell secondarie:

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found

In particolare, per impostazione predefinita, la maggior parte degli ambienti desktop .profileproviene dall'accesso grafico, ma:

  1. Questo non è necessariamente fatto da una shell bash, quindi le definizioni di alias potrebbero non essere nemmeno elaborate e , cosa più importante
  2. anche se le definizioni degli alias vengono elaborate, non vengono passate ai processi figlio . In particolare, non vengono passati alle shell create aprendo una finestra Terminale!

Gli alias non devono essere definiti in .bash_profile(o .bash_login) per lo stesso motivo, ma anche per un altro motivo. Creando ingenuamente uno di questi file e mettendo solo alias definizioni in esso impedisce qualsiasi del codice in .profileesecuzione!

In situazioni in cui .bash_profileo .bash_loginè veramente utile, in genere si trova .profileda qualche parte in essi, che risolve quel problema. (Quindi l'unico problema rimanente è che, come nel caso della .profiledefinizione di alias .bash_profileo .bash_loginnon funziona correttamente.)

Alias ​​per nuovi singoli utenti, automaticamente

Quando viene creato un account utente del tipo destinato a rappresentare un vero essere umano, in genere viene creata una nuova directory che funge da home directory. I contenuti di /etc/skelvengono quindi copiati nella loro home directory. Questo è il modo in cui più utenti iniziano con alcuni file di configurazione simili nelle loro directory home. In Ubuntu, questo include .profile, .bashrce altri file.

Per modificare quali alias sono definiti per i nuovi utenti, puoi semplicemente inserirli /etc/skel/.bash_aliases(dovrai crearli) o /etc/skel/.bashrc.

Se modifichi un file già esistente, /etc/skelpotresti voler prima eseguire il backup /etc/skel, ma non dovresti inserire il backup , altrimenti verrà copiato nelle home directory dei nuovi utenti.

Questo è probabilmente il modo migliore per aggiungere nuovi alias per più utenti. Gli utenti esistenti possono semplicemente aggiungere gli alias stessi. Se si definiscono gli alias in /etc/skel/.bash_aliases, è possibile semplicemente indirizzarli a quel file, che possono scegliere di copiare nelle loro directory home (o aggiungerli al proprio .bash_aliasesfile personalizzato ).

È banale per un utente definire un alias. Inoltre, gli alias non sono estremamente robusti ; funzionano solo in circostanze particolari. Se è necessario creare un nuovo comando che funzioni sempre, per tutti , non è necessario implementare quel comando come alias. E non puoi forzare con successo gli alias sugli utenti che non li vogliono: possono semplicemente unaliasfarli.

Alias ​​globali, per tutti gli utenti

Anche se ti consiglio di evitare questo approccio, puoi definire gli alias nel file globale /etc/bash.bashrc . Verranno quindi definiti sia per shell interattive non di accesso che per shell interattive di accesso. Il motivo è, prima che uno dei file nella home directory dell'utente venga fornito:

  • Le shell di accesso (e solo le shell di accesso e altri processi che si comportano come shell di accesso) eseguono /etc/profileautomaticamente i comandi .
  • Solo le shell senza login eseguono i comandi /etc/bash.bashrcautomaticamente, ma
  • Il default di Ubuntu /etc/profilecontrolla se la shell in esecuzione è bash (e se /etc/bash.bashrcesiste) e, in tal caso, fonti /etc/bash.bashrc.

Questo è analogo al modo in cui l'utente predefinito utilizza .profilel'origine per utente .bashrcse la shell è bash (come descritto sopra).

Ecco come appare il codice effettivo per questo nell'impostazione predefinita /etc/profile:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

Quel blocco svolge anche altre attività. In particolare, l'esterno ifverifica se è probabile che la shell sia interattiva (controllando che il testo del prompt non sia vuoto), quindi controlla se la shell corrente è bash e /etc/bash.bashrcse le fonti lo sono, e se non funziona un po ', per bash , è già stato eseguito /etc/bash.bashrc.

Si dovrebbe non definire alias globali in /etc/profileper gli stessi utenti ragione non li dovrebbero definire nei loro locali .profiles: se lo fai, saranno definite solo per la shell di login, e non per le loro conchiglie bambino.

Infine, nota che, a differenza del predefinito per utente .bashrc, il /etc/bash.bashrcfile predefinito non contiene nulla sugli alias. È in qualche modo insolito fornire agli alias degli utenti in un file in cui non è possibile modificarli o disabilitarli. (Naturalmente, ancora in grado di farlo, sovrascrivendo le loro definizioni nel proprio locale .bashrc, .bash_aliaseso altrove.)

Ulteriori letture


5

Ecco alcune belle letture al riguardo. ".bash_profile viene eseguito per le shell di accesso, mentre .bashrc viene eseguito per le shell interattive non di accesso"

Quindi, per il tuo alias, usa .bash_profile


4
Inserire gli alias .bash_profilenon è corretto. In Ubuntu, .profile(che funziona per le shell di login), si verifica .bashrcquando si tratta di una shell bash interattiva. Quindi mettere alias in .bashrc(o .bash_aliases, di provenienza .bashrc) li definisce in tutte le shell bash interattive. Gli alias in .bash_profilegenerano questo problema , tra gli altri. Vedi questo , quello , la mia risposta , e ~/.bashrci commenti di default che raccomandano di inserire alias lì o dentro .bash_aliases.
Eliah Kagan,
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.