Gli alias Bash dovrebbero andare nei file .bash_aliases
o .bashrc
nelle singole directory home. Se devi creare alias bash globali, possono entrare /etc/bash.bashrc
, ma è spesso meglio semplicemente aggiungerli ai file .bash_aliases
o .bashrc
in /etc/skel
modo che siano ereditati dagli utenti appena creati.
E ' praticamente sempre sbagliato a definire un alias in a .profile
, .bash_profile
o /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 .bashrc
nella home directory dell'utente. Di default in Ubuntu, ogni utente .bashrc
stesso 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 .bashrc
rivela che è ufficialmente inteso che gli alias entrino .bashrc
o .bash_aliases
. .bashrc
contiene già alcune definizioni di alias (esegui grep '^[[:blank:]]*alias' ~/.bashrc
per 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_login
esista, si ottiene invece.
- ... A meno che non
.bash_profile
esista, si ottiene invece.
Tuttavia, la buona notizia è che di default in Ubuntu, comandi in .bashrc
saranno anche eseguite in shell di login interattiva , perché il default .profile
controlla se la shell bash corrente è (e se .bashrc
esiste), 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_aliases
nelle 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 .profile
proviene dall'accesso grafico, ma:
- Questo non è necessariamente fatto da una shell bash, quindi le definizioni di alias potrebbero non essere nemmeno elaborate e , cosa più importante
- 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 .profile
esecuzione!
In situazioni in cui .bash_profile
o .bash_login
è veramente utile, in genere si trova .profile
da qualche parte in essi, che risolve quel problema. (Quindi l'unico problema rimanente è che, come nel caso della .profile
definizione di alias .bash_profile
o .bash_login
non 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/skel
vengono 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
, .bashrc
e 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/skel
potresti 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_aliases
file 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 unalias
farli.
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/profile
automaticamente i comandi .
- Solo le shell senza login eseguono i comandi
/etc/bash.bashrc
automaticamente, ma
- Il default di Ubuntu
/etc/profile
controlla se la shell in esecuzione è bash (e se /etc/bash.bashrc
esiste) e, in tal caso, fonti /etc/bash.bashrc
.
Questo è analogo al modo in cui l'utente predefinito utilizza .profile
l'origine per utente .bashrc
se 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 if
verifica 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.bashrc
se 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/profile
per gli stessi utenti ragione non li dovrebbero definire nei loro locali .profile
s: 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.bashrc
file 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_aliases
o altrove.)
Ulteriori letture