2011-04-19

Ricerca di un comando precedente con bash - Il punto esclamativo (!)

Nel post Ricerca di un comando precedente con bash - Ctrl-R ho accennato, in un tuffo nel passato, a qualche utilizzo dei comandi per ricercare e ripetere comandi precedentemente digitati; ce ne sono tanti altri ed alcuni anche poco immediati e difficilmente memorizzabili. Ritengo che un comando per essere utilizzabile debba essere facile da ricordare, velocizzare notevolmente l'esecuzione dell'attività in corso e utilizzabile di frequente.
Come dicevo ci sono molti comandi ! o meglio il comando della shell è uno e si chiama history, con questo comando si possono ottenere gli ultimi comandi memorizzati dalla shell, davanti ad ogni comando viene riportato un numero che identifica univocamente il comando precedente.
Il carattere ! viene descritto nella sezione History Expansion della documentazione di bash in particolare ma anche di altre shell.

Il primo utilizzo che voglio descrivere delle sequenze che iniziano con ! è quello per ripetere semplicemente un comando indicandone il numero che lo identifica nella lista riportata dal comando history, per fare ciò va digitato il ! seguito, senza spazi, dal numero del comando scelto nella lista. Ad esempio per eseguire il comando identificato dal numero 45:

!45

Se non si vuole ricorrere al comando history ma ci si ricorda che il comando è stato eseguito poco primo e per la precisione 3 comandi prima, si può digitare il ! seguito dal numero negativo 3:

!-3

Nel caso del comando immediatamente precedente si può usare l'abbreviazione !! che corrisponde ad eseguire !-1 ma sicuramente più veloce da digitare.

Se non ci si ricorda precisamente il numero del comando e si ritiene poco immediato ricorrere al comando history per ottenere l'elenco nel quale ricercare il comando, si può effettuare la ricerca dell'ultimo comando che inizia con una determinata stringa. A titolo di esempio ipotizziamo che abbiamo eseguito un comando dalla digitazione complessa, questo comando non ha funzionato perchè ci si è dimenticato di preparare correttamente i file da far processare, si deve ricorrere all'esecuzione di una serie di comandi per posizionarsi in altre directory, copiare file etc. etc. poi si può rieseguire il comando senza aver tenuto a mente quanti comandi sono stati eseguiti nel frattempo, ricordandosi la stringa iniziale del comando supponiamo tar ed essendo certi che la stessa stringa non sia presente all'inizio di comandi che lo seguono, si può digitare

!tar

Se ci si ricorda una stringa non all'inizio ma all'interno del comando eseguito, supponiamo l'opzione -name del comando find, e si è certi che non sia presente in altri comandi, si può eseguire:

!?-name 


Un ultimo utilizzo che trovo molto comodo della history substitution è l'utilizzo dell'ultimo parametro fornito al comando precedente. Mi capita spesso di creare una directory e di "dovermici spostare dentro" (perdonate il senso figurato, non mi viene in mente un modo elegante per descrivere l'azione cd nel contesto della frase), ad esempio la directory /tmp/analisi.log.temp, in questo caso ricorro alla combinazione !$ ed il comando risulta:

mkdir /tmp/analisi.log.temp
cd !$


Per il momento penso che possa essere sufficiente, aggiungo solamente che questa è solo una minima parte della complessa sintassi della history substitution ma tra tutte le combinazioni possibili sono tra le più semplici e tra le più frequentemente utilizzabili.

Nessun commento:

Posta un commento