Come ottimizzare la shell tcsh in Mac OS X?
  • Faq 255 per i file di configurazione di bash
  • Faq 285 per personalizzare i comandi di shell creandone di propri che accettano il passaggio di parametri

In questa FAQ si spiega come ottimizzare l'uso della shell tcsh. Fino a Jaguar (Mac OS X 10.2) questa era la shell di default. In Panther (10.3) è stata sostituita con bash. Chi volesse usare la tcsh come shell di default in Panther, non deve fare altro che lanciare Applicazioni | Utility | Gestione NetInfo, selezionare la voce corrispondente al proprio utente sotto /users e modificare il valore di shell da /bin/bash a /bin/tcsh.

Le shell, ogni volta che vengono avviate, vanno a leggersi alcuni file in cui è contenuta la loro configurazione. Nel caso di tcsh questi file sono, nell'ordine:

/private/etc/csh.cshrc
/private/etc/csh.login
~/.tcshrc
~/.login

I file csh.cshrc e .tcshrc sono eseguiti ogni volta che si lancia una shell tcsh, mentre csh.login e .login sono eseguiti soltanto quando si lancia una shell di login, ma non quando si lancia una sub-shell. Inoltre csh.cshrc e csh.login vengono eseguiti per qualsiasi utente del sistema, mentre .tcshrc e .login sono i file in cui ciascun utente può impostare la propria personale configurazione.

Quando si installa OS X, i due file .tcshrc e .login non sono presenti nella home dell'utente e quindi la tcsh esegue soltanto la configurazione minimale contenuta nei due file csh.cshrc e csh.login. In questa situazione si incontrano i seguenti inconvenienti:

  • non funziona l'autocompletamento dei comandi premendo il tasto Tab;
  • per eseguire un comando bisogna inserirne l'intero percorso, piuttosto che il solo nome;
  • non vengono trovati i manuali dei comandi quando si utilizza il comando man;
  • la cronologia dei comandi eseguiti non viene conservata da una sessione all'altra.

Sotto /usr/share/tcsh/examples sono però presenti due file bell'e pronti, preparati da Mamma Apple, da usare come modello per i propri .tcshrc e .login. Questi file sono rc e login, quindi per risolvere gli inconvenienti accennati basta copiarseli nella propria home, col nome appropriato.

Per farlo, basta digitare nel Terminale

cp /usr/share/tcsh/examples/rc ~/.tcshrc
cp /usr/share/tcsh/examples/login ~/.login

In questi file sono contenuti anche dei rimandi ad altri file di configurazione contenuti in /usr/share/tcsh/examples (validi per ogni utente), i quali a loro volta rimandano a dei file omologhi contenuti nella home dell'utente specifico. In tale situazione, l'elenco completo dei file cercati dalla shell al login è quindi questo:

/private/etc/csh.cshrc
/private/etc/csh.login (non eseguito dalle sub-shell)
~/.tcshrc
/usr/share/tcsh/examples/tcsh.defaults
/usr/share/tcsh/examples/environment (non eseguito dalle sub-shell)
~/Library/init/tcsh/environment.mine (non eseguito dalle sub-shell)
~/Library/init/tcsh/rc.mine
/usr/share/tcsh/examples/aliases
~/Library/init/tcsh/aliases.mine
/usr/share/tcsh/examples/completions
~/Library/init/tcsh/completions.mine
~/.login (non eseguito dalle sub-shell)
~/Library/init/tcsh/path (non eseguito dalle sub-shell)
~/Library/init/tcsh/login.mine (non eseguito dalle sub-shell)

Se a questo punto si vuole personalizzare la configurazione della shell, la cosa migliore è farlo utilizzando i file (1) che questa cerca nella cartella ~/Library/init/tcsh (che può essere creata anche dal Finder, ricordando che nel sistema in italiano Library appare come Libreria), lasciando così come sono i file .tcshrc e .login gentilmente offerti da Apple.
Vediamo qualche esempio per ciascuno di questi file, in modo da fornire anche qualche suggerimento per rendere più usabile la shell.

In environment.mine, che viene eseguito solo dalle shell di login, possiamo definire le nostre variabili ambientali. Ad esempio, possiamo impostare il simpatico pico come editor di testo predefinito, in modo che quando si lanciano comandi come visudo o crontab -e non ci si ritrovi dentro al ben più ostico vi. Si deve quindi scrivere dentro environment.mine:

setenv EDITOR /usr/bin/pico

In rc.mine possiamo mettere tutte quelle impostazioni che avremmo altrimenti messo dentro .tcshrc, quali keybinding (le associazioni tra combinazioni di tasti e comandi) e variabili locali. Ad esempio possiamo mettere (2):

bindkey '^I' complete-word-fwd
bindkey '^Y' complete-word-back
bindkey -k down history-search-forward
bindkey -k up history-search-backward
set implicitcd
set histdup = erase
set savehist = (150 merge)
set complete = enhance

In aliases.mine possiamo andare a definire i nostri alias personali, ovvero le scorciatoie per eseguire lunghe stringhe di comandi. Ad esempio (3):

alias rm 'rm -i'
alias cp 'cp -i'
alias mv 'mv -i'
alias batteria 'ioreg -p IODeviceTree -n "battery" -w 0 | grep Battery'
alias supertext 'sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit'

In path possiamo indicare directory aggiuntive, oltre a quelle già definite in ~/.login, in cui vogliamo che la shell cerchi comandi e manuali. Ad esempio, per aggiungere ~/comandi ai path e /usr/local/man ai manpath, possiamo scrivere:

set path = ( ~/comandi $path )
setenv MANPATH ${MANPATH}:/usr/local/man

In login.mine possiamo mettere qualsiasi comando vogliamo venga eseguito solo dalle shell di login, che non sia già stato messo in environment.mine.

Volendo, ci si può limitare a creare i soli file rc.mine (in cui mettere anche quello che avremmo messo in aliases.mine) e login.mine (in cui mettere anche quello che avremmo messo in environment.mine e path).

Ci sono anche dei file che le shell eseguono alla fine della sessione. Nel caso di tcsh questi sono:

/private/etc/csh.logout
~/.logout

Anche in questo caso il file .logout non è presente nella home dell'utente, ma ci si può copiare quello presente in /usr/share/tcsh/examples:

cp /usr/share/tcsh/examples/logout ~/.logout

Questo file contiene anche un richiamo al file ~/Library/init/tcsh/logout.mine in cui eventualmente impostare i comandi che si vuole la shell esegua al logout.

(1)
Per creare questi file si può tranquillamente usare TextEdit, purché ci si assicuri che il file sia in formato testo semplice (Formato | Converti in formato Testo) e che quando si salva il file si scelga il formato Unicode (UTF-8) dal menu Codifica solo testo.

(2)
bindkey '^I' complete-word-fwd
Con questo comando si modifica il comportamento dell'auto-completamento: nei casi in cui ci sono più comandi o directory o file che possono completare le lettere già immesse al prompt, premendo il tasto Tab le lettere già inserite verranno completate in automatico con la prima in ordine alfabetico tra le varie alternative. Premendolo un'altra volta si passerà alla voce successiva e così via fino all'ultima tra le alternative disponibili, per poi tornare al punto di partenza con un'ulteriore pressione del Tab.

bindkey '^Y' complete-word-back
Premendo Shift-Tab si ha un comportamento analogo a quello precedente, ma lo spostamento tra le varie opzioni avviene nel verso opposto. Utile soprattutto se si è superata l'opzione desiderata e si vuole tornare indietro.

bindkey -k down history-search-forward
bindkey -k up history-search-backward
Con queste impostazioni si migliora la navigazione nella cronologia dei comandi mediante i tasti cursore alto e basso. Si possono digitare uno o più caratteri e poi premendo la freccia in alto (o in basso) si andrà direttamente alla voce precedente (o successiva) della cronologia che inizia con quei caratteri.

set implicitcd
Attivando questa opzione, per spostarsi in una directory si può digitarne il solo nome, senza dover dare il comando cd. Ad esempio, per spostarsi dalla home alla directory ~/Desktop si può scrivere semplicemente Desktop invece di cd Desktop.

set histdup = erase
Con questa impostazione non si avranno doppioni nella cronologia dei comandi: ogni volta che si darà un comando già presente nella cronologia la voce precedente verrà cancellata.

set savehist = (150 merge)
Con queste impostazioni la shell salverà nella cronologia al massimo i 150 comandi più recenti eseguiti nella sua sessione, senza sovrascrivere la cronologia già esistente, ma integrandola. In questo modo si possono tenere aperte più finestre del Terminale senza che si cancellino la cronologia a vicenda. Il limite massimo impostato deve essere minore o uguale al valore della variabile history, che definisce il numero massimo di comandi memorizzati nella cronologia, impostato a 150 nel file /usr/share/tcsh/examples/tcsh.defaults. Se si vuole aumentare questo limite basta aggiungere set history = x (con x uguale al numero che preferite) al file ~/Library/init/tcsh/rc.mine.

set complete = enhance
In questo modo si rende l'autocompletamento case-insensitive: stando nella home, si potrà digitare cd des[Tab], che completerà in cd desktop e premendo invio ci si sposterà nella directory ~/Desktop.

(3)
alias rm 'rm -i'
alias cp 'cp -i'
alias mv 'mv -i'
Più che delle scorciatoie, questi alias sono una sorta di sicura, utile soprattutto all'utente poco esperto. Tutte le volte che coi comandi rm, cp e mv si proverà a cancellare un file già esistente, la shell ci chiederà la conferma.

alias batteria 'ioreg -p IODeviceTree -n "battery" -w 0 | grep Battery'
Questo è un alias utile a chi possiede un portatile, che permette di controllare lo stato della batteria.

alias supertext 'sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit'
Questo alias permette di lanciare TextEdit coi privilegi di root, utile nel caso in cui si vogliano editare dei file di sistema con la comodità di un editor grafico. Basterà digitare supertext /path/del/file. Ricordarsi di uscire da TextEdit una volta terminata l'operazione, in modo da far terminare il processo della shell con cui lo si è lanciato.

A complemento di questa FAQ vedere anche la Faq 87

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