Come posso potenziare Bash?
  • Faq 178 per i file di configurazione di tcsh
  • Faq 285 per personalizzare i comandi di shell creandone di propri che accettano il passaggio di parametri

I files di configurazione

# questo e` un commento

Dopo avere detto che le righe di commento iniziano con il carattere #, dobbiamo capire che files di configurazione vengono usati da bash, per sapere dove aggiungere le nostre impostazioni.
Bash può essere lanciata in modalità "login" oppure in modalità normale. A seconda dei casi la shell é lanciata in un modo piuttosto che in un altro (per esempio se state usando l'xterm lanciato dal server X11, se state usando Terminal.app oppure se state usando il login testuale ottenuto tramite >console).
Quando viene lanciata in modalità login, bash legge (se esistenti) nell'ordine

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile
Con '~' si intende la directory home dell'utente. Attenzione, /etc/profile e ~/.profile vengono letti anche da sh e da zsh. Su Panther e sulla maggior parte dei sistemi GNU/Linux /bin/sh é in realtà un hard-link a /bin/bash, c'é solo una certa differenza nel comportamento a seconda del nome con cui viene lanciata, ma possiamo tralasciare questo aspetto.
Quando invece bash non viene lanciata in modo interattivo, legge .bashrc.
/etc/profile contiene configurazioni system-wide, valide per tutti gli utenti. Tipicamente vi si può specificare il path degli eseguibili, o delle pagine di man, anche se effettivamente puo` essere conveniente mettere PATH e MANPATH dentro a /etc/bashrc, che viene letto anche da shell interattive e non di login, e poi richiamare da dentro /etc/profile /etc/bashrc (con la riga [ -r /etc/bashrc ] && source /etc/bashrc).

Questo é il contenuto del mio /etc/profile.

PATH="/bin:/sbin:/usr/bin:/usr/local/bin:/usr/sbin:/opt/local/bin:/sw/bin:/usr/X11R6/bin/"
export PATH

In sostanza la variabile PATH viene riempita con le directory dove si hanno eseguibili; poi con la direttiva export vengono "esportate". In pratica vengono trasformate in variabili d'ambiente per i vari programmi che le andassero a controllare.

Il modo standard per settare una variabile é
VARIABILE = "contenuto"

se poi la si vuole esportare (ovvero rendere disponibile ai vari programmi), bisogna aggiungerla all'elenco delle variabili esportate con
export VARIABILE

Questo puó anche essere condensato in
export variabile="quello a cui deve essere uguale"

Una successiva modifica alla variabile potrebber essere fatta cosí
variabile = "nuovo valore"

Possiamo pensare che export aggiunga esclusivamente il nome della variabile alla lista di variabili esportate, ma che in se non agisca sul contenuto.

Ricordiamoci che poi per usare la variabile dobbiamo preporre il segno $, quindi per "stampare a video il contenuto di PATH dovremmo fare

echo $PATH

Un modo compatto per specificare quello di cui sopra sarebbe quindi stato

export PATH="/bin:/sbin:/usr/bin:/usr/local/bin:/usr/sbin:/opt/local/bin:/sw/bin:/usr/X11R6/bin/"

Rispetto al PATH standard, io informo che si possono trovare eseguibili anche in /opt/local/bin (default dei darwin ports), in /sw/bin (default di fink) e in /usr/X11R6/bin/ (dove si trovano alcuni eseguibili installati dal server X11, fra cui per esempio l'xterm stesso).
Sostanzialmente la variabile di ambiente PATH é costituita da una lista di directory separate da ':'.
Nello stesso modo potete specificare per esempio il path delle pagine di man (nella variabile MANPATH, ma questa é un'altra storia).

Come aggiungere elementi al PATH

Supponiamo di non potere/volere modificare il PATH di sistema, specificato in /etc/profile, ma di volere aggiungere directory al nostro path.
Potremmo mettere in .bashrc

PATH="$PATH:/Developer/Tools/"

In questo modo diciamo "alla stringa contenuta in $PATH, aggiungi :/Developer/Tools", che é esattamente quello che serve per aggiungere variabili al PATH. E ovviamente avrei anche potuto fare

PATH="$PATH:/Developer/Tools/:~/bin/"

o aggiungere ancora piú directories

Come includere un file

Ora, usare sia .bash_login che .bash_profile é quasi sempre inutile. E per le mie esigenze trovo molto comodo mettere tutte le mie preferenze dentro .bashrc e poi includere questo file in .bash_login. Questo é il caso che analizzeremo.

La direttiva source indica a bash di includere il file specificato, grossomodo come se si fosse copiaincollato l'altro file dentro quello corrente.
Per esempio se in .bash_login scriviamo

source .bashrc

il contenuto di .bashrc verrà eseguito come se invece di aver scritto "source .bashrc" avessimo copiato il file dentro .bash_login. Tuttavia questo metodo ha il vantaggio che successive modifiche di .bashrc si "vedranno" anche da .bash_login.
Questo metodo ha però sostanzialmente un errore: se il file che proviamo a includere non esistesse, verrà generato un fastidioso errore a schermo. Nulla di grave, ma siccome evitarlo é facile, vedremo come farlo.
Intuitivamente dovremo dire a bash "includi il file foo solo se foo esiste" , ovvero "se foo esiste, includilo". In bash (un vero e proprio linguaggio di programmazione, in effetti), questo si scrive:

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

Versione poco teorica
Se volete assicurarvi che un file venga incluso solo se esiste, fate

if [ -f nomefile ] ; then
    source nomefile
fi

Dove "nomefile" é il nome del file completo del path (per esempio /etc/resolv.conf)

Versione appena più teorica
La sintassi del costrutto if di bash e`

if [ expression  ] ; then
    cose da fare
fi

comunque consiglio di dare un'occhiata al manuale di bash (man bash), per maggiori dettagli; quello che io ho chiamato expression infatti può contenere i vari operatori logici, e può performare diversi conrtrolli sui files e molte altre cose.
Ad ogni modo questa parte non é essenziale per i nostri scopi. Incontreremo solo un altro caso in cui dovremo ricorrere ad una direttiva con if, che peraltro non necessita particolare comprensione.

Lavoriamo su .bashrc

Un primo trucco é quello di usare una direttiva 'if' (l'ultimo tipo che vedrete in questa faq) per evitare che i seguenti vengano eseguiti anche nel caso in cui la shell non sia interattiva (ovvero lanciata da voi in modo che potete scrivere i comandi e compagnia), ma che piuttosto venga invocata da uno script o simili.
Nelle shell interattive la variabile d'ambiente $PS1 é settata, quindi per renderci conto se la shell é interattiva basta

if [ "$PS1" ] ; then

e scrivere qui tutti i comandi (ricordandosi di concludere con fi)
Tenendo conto che il nuovo comando ls di Panther é a colori se trova settata la variabile d'ambiente CLICOLOR scriviamo per esempio
export CLICOLOR=

Teniamo conto che possiamo anche personalizzare quali colori vengono associati a quali files, attraverso la variabile d'ambiente LSCOLORS. Ma qui vi rimando al manuale di ls.
 

potremmo poi settare altre variabili d'ambiente (per esempio se usiamo un client irc testuale come BitchX)

        export IRCNICK=  <--- qui mettete il vostro nick racchiuso da doppi apici
        export IRCNAME=  <--- qui mettete il vostro nick racchiuso da doppi apici
        export IRCUMODE="+r"
        export IRCSERVER="irc.azzurra.org"

Questi sono solo esempi.
Un ultimo esempio (a caso)

if [ "$TERM" == "xterm" ] ; then
        TERM="xterm-color"
fi

Il significato é "se la variabile d'ambiente TERM é settata a "xterm" (ovvero se state usando un xterm), allora settala ad xterm-color".

Ora ci dedicheremo al comando alias, che serve per introdurre scorciatoie. In questo modo potrete creare delle scorciatoie per i comandi usati piú di frequente.

Alias

La sintassi generale é
    alias scorciatoia='vecchio comando'

alcuni esempi pratici

    alias ll='ls -l'
    alias la='ls -AF'
    alias l='ls -CF'
    alias lh='ls -lh'

    alias batteria="ioreg -p IODeviceTree -n 'battery' -w 0 | grep Battery"

questi per lanciare alcuni programmi Cocoa o Carbon da terminale

    alias gvim='/Applications/vim/Vim.app/Contents/MacOS/Vim -g'
    alias Emacs='/Applications/Emacs.app/Contents/MacOS/Emacs'
    alias firebird='/Applications/Mozilla\ Firebird.app/Contents/MacOS/MozillaFirebird'

come avete notato, con alias, i comandi possono anche includere delle opzioni.

Bash completion

Può essere comodo abilitare il completamento automatico non solo sui nomi dei programmi e dei files, ma anche su gli argomenti dei comandi, per esempio il completamento automatico delle pagine di man e simili. Per maggiori informazioni cercare nel manuale di bash la stringa "Programmable Completion" (schiacciate '/' poi digitate Programmable Completion e schiacciate il tasto n fino a quando non raggiungete un intero paragrafo così intitolato).
MacOS X non viene gia` predisposto per il completamento, e il file generale dove vengono elencate le modalità é piuttosto lungo e complesso da scrivere. Per questa ragione rendo disponibile il file che ho trovato sulla mia debian, e che uso con successo sul mac.
Potete scaricarlo qui [124 KB].

A questo punto dopo avere scaricato questo file, copiatelo dentro ad /etc (dovrete essere root, quindi ammettendo che lo abbiate scaricato nella vostra home
sudo cp ~/bash_completion /etc
e quando lo chiede digitate la password di amministratore)

A questo punto aggiungete dentro a .bashrc

    if [ -f /etc/bash_completion ]; then
      . /etc/bash_completion
    fi

per attivare il completamento potenziato.

Bash logout

Dentro al file .bash_logout, potete mettere comandi da eseguire in uscita, per esempio per svuotare la history dei comandi o simili.

Esempi

.bash_login

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

.bashrc

if [ "$PS1" ]; then

    PATH="$PATH:/Developer/Tools/"

    export CLICOLOR=

    alias ll='ls -l'
    alias la='ls -AF'
    alias l='ls -CF'
    alias lh='ls -lh'

    alias batteria="ioreg -p IODeviceTree -n 'battery' -w 0 | grep Battery"

    if [ -f /etc/bash_completion ]; then
      . /etc/bash_completion
    fi

    export LSCOLORS=ExgxdxbxcxCeceacad

    QTDIR=/Developer/qt
    PATH=$QTDIR/bin:$PATH
    DYLD_LIBRARY_PATH=$QTDIR/lib:$DYLD_LIBRARY_PATH

    export QTDIR PATH DYLD_LIBRARY_PATH

    #irc variables
    export IRCSERVER="irc.azzurra.org"

    # nntp variables
    export NNTPSERVER="news.individual.net"

    alias gvim='/Applications/vim/Vim.app/Contents/MacOS/Vim -g'
    alias Emacs='/Applications/Emacs.app/Contents/MacOS/Emacs'
    alias firebird='/Applications/Mozilla\ Firebird.app/Contents/MacOS/MozillaFirebird'

fi

ATTENZIONE: Le note sono inserite in modo anonimo dai visitatori del sito, e non sono state verificate da chi cura le Faq.
Nota di gui_dos
Due comandi praticamente indispensabili in Panther: bind '"\e[3~":delete-char' per ripristinare le funzionalità del tasto CANC export LESS=X per evitare che lo schermo venga ripulito al termine della lettura di pagine man

[ Home | Elenco delle FAQ | Risorse | Feed RSS ]