Bash tips: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
m (→‎Manipolazione delle stringhe: piccole correzioni)
Riga 1: Riga 1:
Questo Wiki vuole essere prima di tutto un punto di raccolta ideale per le conoscenze acquisite dai singoli durante l' uso di Debian GNU/Linux in ambito casalingo e/o lavorativo, in modo che il sapere di uno diventi quello di tutti.
==Intro==
'''GNU Bash''' è la shell *nix probabilmente più ricca di funzionalità sia per l'uso interattivo che per lo scripting. Spesso però molte funzioni sono poco note.


Le guide ritenute meglio scritte e pi� approfondite, dopo un processo di controllo e revisione a cui tutti siete liberi di partecipare, vengono classificate [[:Categoria:Debianized|Debianized]] e contrassegnate dalla [[Debian Swirl]] http://guide.debianizzati.org/images/swirl.png.
Questa pagina ha lo scopo di raccogliere il più ampio numero di "trucchi" più o meno noti riguardanti Bash, senza avere peraltro la pretesa di coprire tutte le funzionalità.


Potete trovare un elenco completo delle guide Debianized [http://guide.debianizzati.org/index.php/Categoria:Debianized qui]
==Per iniziare==
Prima di iniziare non posso non segnalare altre due guide presente sul wiki che danno dei tip molto utili su Bash:
Questa � la lista delle guide attualmente presenti:


== Mondo Debian ==
* [[Come abilitare il completamento automatico 'avanzato']]
=== Introduzione a Debian ===
* [[Colorare bash]]
* [[L' Universo Debian]]
 
* [[La struttura della Distribuzione]]
==Shell Interattiva==
In questa sezione verranno elencate funzionalità riguardanti l'uso interattivo di Bash.
 
===Navigare velocemente tra le directory===
* Per andare sulla propria '''home''' basta digitare il comando '''cd''' senza nessun paramentro.
* Per tornare indietro alla precedente directory visitata è sufficiente il comando '''cd -'''
* E possibile salvare un percorso con '''pushd''' e richiamarlo con '''popd'''. In realtà questi comandi (come il nome può fare intuire) implementano una coda FIFO (First In First Out) nella quale è possibile memorizzare un numero illimitato di percorsi per poi richiamarli dall'ultimo inserito in poi. Usare questi comadi è semplicissimo: basta usare '''pushd''' al posto di '''cd''' (in tal modo si memorizzano i percorsi via via visitati) e poi digitare '''popd''' una o più volte per tornare indietro.
 
===Riutilizzo degli argomenti===
Bash memorizza l'ultimo argomento del comando precedente in una speciale variabile chiamata $_. E' possibile fare riferimento all'ultimo argomento dell'ultimo comando usando direttamente $_ ma la via di gran lunga più veloce è comoda è usare 'ESC .'.
 
Ecco un esempio stupido, creare un directory ed entrarvi:
<pre>
$ mkdir /usr/local/nuovo-programma
$ cd ESC.
</pre>
 
Altro esempio forse un pò più utile, creare velocemente uno script:
<pre>
$ :> /usr/local/bin/nomescript
$ chmod +x ESC.
$ gvim ESC.
</pre>
 
===Editing della linea di comando===
Alcuni tasti di scelta rapida per l'editing da linea di comando:
: '''<tt>CTRL+a</tt>''': Vai all'inizio delle linea
: '''<tt>CTRL+e</tt>''': Vai alla fine della linea
: '''<tt>CTRL+k</tt>''': Cancella fino dalla posizione corrente alla fine della linea
: '''<tt>CTRL+u</tt>''': Cancella fino dalla posizione corrente all'inizio della linea
: '''<tt>CTRL+l</tt>''': Pulisce lo schermo
: '''<tt>META+f</tt>''': Vai una parola avanti
: '''<tt>META+b</tt>''': Vai una parola indietro
: '''<tt>META+d</tt>''': Cancella la parola successiva
: '''<tt>META+backspace</tt>''': Cancella la parola precedente
 
{{Box|Nota sul tasto META|Il tasto Meta può essere usato premendo ALT e ''contemporaneamente'' il carattere del comando che interessa, oppure premendo ESC e ''successivamente'' il tasto del comando che interessa. In quest'ultimo modo non è necessario permere due tasti conemporaneamente. Questa è una regola generica per gli shortcut di bash che usano il tasto Meta.}}
 
===Uso avanzato dello storico===
Come noto Bash memorizza gli ultimi (solitamente 500 ma il numero è impostabile in $HISTSIZE) comandi digitati ai quali è possibile accedere semplicemente con le freccette SU e GIU. Tuttavia è possibile effettuare molte altre operazioni per ricercare nello storico dei comandi.


=== Installazione ===
====Ricerca incrementale inversa====
* http://guide.debianizzati.org/images/swirl.png [[Guida a Grub]]
Sotto questo astruso nome si cela la possibilità di ricercare nello storico dei comandi semplicemente premendo CRTL+r e digitando qualche carattere del comando cercato. Verrà immendiatamente mostrato l'ultimo comando che soddisfa i criteri di ricerca. Se più comandi soddisfano la ricerca è possibile scorrerli (dall'ultimo al primo) premendo nuovamente CTRL+r.
* [[Jigdo | Jigdo: Scaricare e Aggiornare le iso di Debian]]
* [[Note sull'installazione di Debian]]


=== Gestione dei Pacchetti ===
Una volta trovato il comando lo si può eseguire con INVIO oppure editare con CTRL+j.
* [[Introduzione all' Apt System]]
* [[I repository ed il loro utilizzo]]
* http://guide.debianizzati.org/images/swirl.png [[Pulire Debian]]
* [[Apt-cdrom | '''Apt-cdrom''': aggiunta di cd/dvd nella lista dei repository]]
* [[Apt-file: ricerca all'interno dei pacchetti | '''Apt-file''': ricerca all'interno dei pacchetti]]
* [[Apt-listbugs: come monitorare i bug | '''Apt-listbugs''': come monitorare i bug]]
* [[Apt-zip: aggiornamenti senza una connessione veloce | '''Apt-zip''': aggiornamenti senza una connessione veloce]]
* [[Apt-spy: trovare i mirror pi� veloci | '''Apt-spy''': trovare i mirror pi� veloci]]
* [[APT uso avanzato: mixare releases diverse]]
* http://guide.debianizzati.org/images/swirl.png [[Impedire l' aggiornamento di un pacchetto]]
* [[Aptitude | '''Aptitude''': come amministrare i pacchetti]] ''(stub)''


=== Creazione e modifica dei pacchetti ===
====Ricerca nella cronologia====
* http://guide.debianizzati.org/images/swirl.png [[Make-jpkg: Pacchettiziamo Java Sun| '''Make-jpkg''': Pacchettiziamo Java Sun]]
Altra possibilità è cercare tra tutti i comandi precedenti che cominciano con un certo gruppo di lettere.
* [[Pacchetti binari e sorgenti]]
* [[Applicare una patch ad un pacchetto Debian]]
* [[Apt-build: ottimizzazione dei pacchetti | '''Apt-build''': ottimizzazione dei pacchetti]]
* [[Dpkg-sig: Firma dei packages .deb |  '''Dpkg-sig''': Firma dei packages .deb]]
* [[Pacchetizzare un tema per Bootsplash]]


=== Gestione dei pacchetti Lato Server ===
Questa funzionalità non è abilitata di default; bisogna modificare il file /etc/inputrc (o creare un analogo file .inputrc nella propria home), aggiungendo le righe:
* [[Apt-Proxy: un proxy per i pacchetti Debian| '''Apt-Proxy''': un proxy per i pacchetti Debian]]
* [[Debmirror: creiamo un mirror Debian |'''Debmirror''': creiamo un mirror Debian]]
* [[Creare un Repository Debian]]
* [[Gestione di un repository con debarchiver]]
* [[Usare apt-cacher per creare una cache dei pacchetti usabile in una LAN]]
* [[Dupload per l'upload dei pacchetti Debian]]


==Configurazione Sistema==
<pre>
===Kernel===
# PgUp/Down searches history in bash
* http://guide.debianizzati.org/images/swirl.png [[Debian Kernel Howto]]
"\e[5~":        history-search-backward
* [[Esempio configurazione kernel]]
"\e[6~":        history-search-forward
* [[Kernel2.6.10 - Framebuffer - Gensplash Patch]]
</pre>
* [[Kernel 2.6 su Debian Woody]]
* [[Compilazione Kernel 2.6.11 con Bootsplash]]
* [[Pagina di manuale di module-assistant|Pagina di manuale di '''<tt>module-assistant</tt>''']]
* [[Low-latency 2.6 kernel per applicazioni audio realtime]]
* [[Script: Confronto Configurazioni Kernel]]


===Sistema===
In questo esempio si è scelto di usare i tasti PGUP e PGDOWN.
* [[SysV | Il sistema SysV per la gestione dei Runlevel]]
Da notare che il file inputrc contiene altre comodità pronte all'uso: basta decommentarle!
* [[Udev e Debian]]
* [[Configurare il server X in Debian GNU/Linux]]
* [[Linux Admin Quick Reference]]
* [[Debian: accelerare GTK con Cairo e Glitz]]


===Applicazioni Esterne===
====Accesso diretto====
* [[Pacchettizzare ed installare Xorg su Debian Sid]]
Il carattere ! permette di richiamare un preciso comando dello storico:
* [[Installazione Qemu con supporto accelerazione Kqemu]]
* [[ePSXe Emulatore Playstation]]
* [[Installare OpenOffice2 su Debian Etch]]
* [[DVD Backup: xDVDShrink per Debian]]


===Altro===
<pre>
* [[Dual Boot Debian-Altra distribuzione Linux]]
$ !-3
* [[Dual Boot Linux-Windows]]
</pre>
* [[Logging su MySQL]]
* [[Password sicure: la base della sicurezza informatica]]
* [[Script Bash per Avvio e Visualizzazione dati Seti@home]]


===Tips and Tricks===
richiama ed esegue il terzultimo comando, mentre:
====Bash====
 
* [[Bash tips]]: un elenco di trucchetti sull'uso interattivo e sullo scripting Bash
<pre>
* [[Colorare bash]]
$ !ta
* [[Come abilitare il completamento automatico 'avanzato']]
</pre>
* [[Un logout con schermo pulito]]
 
* [[Bash Script: Cambiare i permessi ricorsivamente]]
richiama ed esgue l'ultimo comando che comincia con '''ta''' (potrebbe essere: tail -f /var/log/messages). Il '''!!''' richiama invece l'ultimo comando.
 
Se si vuole richiamare il comando ma non eseguirlo si può usare il modificatore :p (''print''), ad esempio
 
<pre>
$ !ta:p
</pre>
 
stampa l'ultimo comando che inizia con ''ta''.
 
Per richiamare l'ultimo comando che contiene una certa parola (non all'inizio):
 
<pre>
$ !?parola?
</pre>
 
E' possibile anche richiamare un parametro di un comando usando ''':''' seguito dal numero del parametro (0 indica il comando stesso). Ad esempio:
 
<pre>
$ man !-1:0
</pre>
 
visualizza la pagina di manuale dell'ultimo comando.
 
Per eseguire un comando con gli stessi argomenti del comando precedente:
 
<pre>
$ nuovocomando !!:*
</pre>
 
Per ulteriori informazioni sull'uso interattivo dello storico si rimanda all'apposita sezione del manuale di riferimento:
 
* [http://www.gnu.org/software/bash/manual/bashref.html#SEC117 Hystory expansion]
 
==Bash Scripting==
In questa sezione verranno elencati alcuni brevi tip per lo scripting Bash. Questa non vuole essere assolutamente una guida completa, ma piùttosto un elenco di costrutti per lo scripting bash particolarmente eleganti, curiosi e/o poco noti.


====Firefox====
===Variabili speciali===
* [[Velocizzare Firefox per la banda larga]]
* [[Il vostro motore di ricerca da Firefox]]
* [[Aggiungere un motore di ricerca al quicksearch di Firefox]]


====Altro====
; $? : Contiene il valore di uscita dell'ultimo comando o funzione. Il comando ha successo se ritorna zero, qualsiasi altro valore indica invece un codice di errore.
* [[Convertire immagini .nrg in immagini .iso]]
* [[Nautilus: navigare con una sola finestra]]
* [[Associare a thunderbird il browser preferito]]
* [[Antispam in Evolution con Bogofilter]]
* [[Impostare la lingua italiana per Gnome]]
* [[Impostare  e modificare data e ora]]
* [[Impostare e modificare il layout della tastiera]]
* [[Abilitare_Xinerama | Multi monitor con Xinerama]]
* [[Abilitare ESound con ALSA in Gnome]]
* [[Cambiare il Tema dei Cursori per il Mouse]]
* [[XFCE e shutdown da utente]]


==Networking==
; $@ : Contiene la lista dei paramentri passati allo script corrente. Ogni parametro viene opportunamente quotato e questo permette l'utilizzo di questa variabile nei '''cicli for''' per processare (ad esempio) una lista di nomi di file che possono contenere anche spazi. L'uso di questa variabile è quindi in genere consigliato rispetto a '''$*''' che ha la stessa funzione ma non quota i vari parametri.
===Debian Server===
====Condivisione risorse====
* [[Directory shared tra macchine linux (nfs)]]
* [[Condivisione risorse con Samba]]


====Mailing====
''Esempio:''
* [[Mail Server Sicuro con Postfix]]
<pre>
FILES=$@


====Http====
for file in $FILES; do
* [[Server Web Casalingo]]
    # Fare quello che si vuole con $file
* [[LAMP: Linux, Apache, MySQL e PHP]]
    echo $file 
* [[XAMPP: Linux, Apache, MySQL e PHP facili]]
    # ...
* [[Debian MapServer/MapScript]]
done
</pre>


===Amministrazione===
; $$ : PID del processo corrente.
====Gestione Remota/Locale====
* [[Wake On Lan | '''Wake On Lan''' per accendere i propri PC a distanza tramite la LAN]]
* [[Debian e il controllo di servizi e demoni]]
* [[Gestione della banda in Apache]]
* [[Ssh e autenticazione tramite chiavi]]


====Connettivita'====
; $! : PID dell'ultimo job in background
* [[Condividere la connessione a internet]]


===Sicurezza===
=== Manipolazione delle stringhe ===
====Firewalling====
Nelle shell *nix, storicamente, la manipolazione delle stringhe viene fatto attraverso programmi esterni alla shell come seq, awk e perl. Questi programmi vengono ancora usati quando si vuole mantenere la compatibilità con la shell <tt>'''sh'''</tt>, tuttavia imparare anche il solo sed (il più semplice dei tre) non è cosa immediata.
* [[Debian e iptables]]
* [[Firewall Builder]]
* [[Parametri a run-time per Netfilter]]


====Monitoraggio & Scanning====
Se si usa Bash, non è necessario usare nessun programma esterno, ma basta imparare i tre operatori fondamentali ed alcuni concetti di base, per poter fare tutte le manipolazioni più comuni.
* [[Monitoriamo il Sistema]]
* [[Mrtg: monitoriamo la banda]]
* [[Cacti | Cacti: monitor di rete, per pi� computer]]
* [[Munin]]


====Proxy====
In Bash una stringa non è altro che una variabile, si indica dunque con <tt>${nome}</tt> oppure con la forma abbreviata <tt>$nome</tt>. Il nome dentro le graffe può essere seguito da un modificatore che manipola la variabile, ad esempio:
* [[Privoxy: navigazione sicura a prova di spam]]


====Tunneling====
  VAR="stringa-di-esempio"
* [[Openvpn]]
  echo ${VAR#stringa-}


== Hardware ==
elimina "stringa-" dall'inizio della variabile.
=== Fotocamere digitali e dispositivi di memorizzazione di massa removibili ===
* [[Usare Fotocamere Digitali|Usare Fotocamere Digitali (libgphoto2)]]
* [[Usare Fotocamere Digitali (usb-storage)]]
* [[UsbMount: Gestione automatizzata delle periferiche usb di memorizzazione]]
* [[Debian e iPod]]


=== Modem e periferiche di rete ===
I modificatori sono molti, ma possono essere facilmente ricordati se si imparano i tre fondamentali:


* [[Debian e i Modem ADSL]]
; <tt>#</tt> : sottrae dall'inizio della stringa ''(minimale)''
; <tt>%</tt> : sottrae dalla fine della stringa ''(minimale)''
; <tt>/</tt> : sostituisce una sottostringa con un altra ''(solo la prima volta che viene incontrata)''


==== Modem USB ADSL ====
Questi operatori sono minimali, questo vuol dire che se si usano le espressioni regolari per indicare la sottostringa (da eliminare o sostituire) verrà individuata in caso di ambiguità la sottostringa più piccola (o solo la prima nel caso della sostituzione).
* [[Installare i driver conexant accessrunner]]
* [[Installare i driver eagle-adsl]]
* [[Installare i driver eci-adsl]] ''(stub)''
* [[Installare i driver unicorn (BeWAN)]] ''(stub)''
* [[Modem adsl Telindus ND220]]
* [[Modem adsl Aethra Starmodem]]
* [[Modem adsl Fastrate 100 USB]]


==== Modem Ethernet ====
Per ottenere gli operatori massimali basta raddoppiare il simbolo:
* ''Inserire qui eventuali guide su modem ethernet''


==== Modem dial-up 56K ====
; <tt>##</tt> : sottrae dall'inizio della stringa ''(massimale)''
* ''Inserire qui eventuali guide su modem a 56K''
; <tt>%%</tt> : sottrae dalla fine della stringa ''(massimale)''
; <tt>//</tt> : sostituisce una sottostringa con un altra ''(tutte le volte che viene incontrata)''


==== Schede di rete Wireless ====
Gli operatori massimali cercano di individuare la sottostringa più grande che corrisponde all'espressione regolare (nel caso del modificatore '''//''' tutte le sottostringhe vengono sostituite). Gli operatori di questo tipo vengono comunemente chiamati anche ''greedy (ingordi)''.
* [[Wireless Support | Informazioni sul supporto alle periferiche Wireless]]
* [[Script Bash abilitazione scheda wireless]]
* [[Intel PRO/Wireless 2200BG]]
* [[NdisWrapper | NdisWrapper: Usiamo i driver di Windows per il WLan con GNU/Linux]]


=== Schede Video ===
Per una spiegazione dettagliata di tutti i modificatori e anche di altri modi di manipolare le stringhe in Bash (ad esempio <tt>expr</tt>) vedere:
* [[Installazione Driver ATI per schede ATI RADEON MOBILITY 9700 SE]]


=== Stampanti ===
* [http://www.tldp.org/LDP/abs/html/string-manipulation.html Advanced Bash-Scripting Guide: Manipulating Strings]
==== Stampanti USB ====
* ''Inserire eventuali guide su come far funzionare stampanti con porta USB''


==== Stampanti con porta parallela ====
==== Esempi: manipolazione delle stringhe ====
* [[Introduzione all'installazione di stampanti con porta parallela]]


==== Stampanti bluetooth ====
  VAR="questa.sarebbe.una.stringa.di.esempio"
* [[Introduzione all'installazione di stampanti bluetooth]]
 
                      # Risultato:
 
  echo ${VAR#*.}      # --> sarebbe.una.stringa.di.esempio
  echo ${VAR##*.}    # --> esempio
 
  echo ${VAR%.*}      # --> questa.sarebbe.una.stringa.di
  echo ${VAR%%.*}    # --> questa
 
  echo ${VAR/st/ST}  # --> queSTa.sarebbe.una.stringa.di.esempio
  echo ${VAR//st/ST}  # --> queSTa.sarebbe.una.STringa.di.esempio


=== Scanner ===
===Alternativa a basename===
* [[Epson Perfection 2480 photo - usb scanner]]
Quando in uno script ci si deve riferire al nome dello script stesso è usuale utilizzare il comando (esterno a bash) '''basename'''. Tuttavia, tramite i modificatori del paragrafo precedente, Bash stessa è in grado di fornire questa funzionalità. Basta usare l'espressione ${0##*/}.
* ''Inserire qui eventuali altre guide su come far funzionare scanner con Debian''


===Palmari e cellulari===
Esempio:
* [[Debian e Nokia 7210: uso di gnokii e gestione degli sms]]
<pre>
usage () {
        echo "usage: ${0##*/} "
        exit 1
}
</pre>


==Portatili==
=== Cambiare l'estensione ai file ===
===Laptop Debianizzati===
Rinomina tutti i file <tt>*.txt</tt> della directory corrente in <tt>*.log</tt>:
Troverete di seguito i resoconti d'installazione di Debian su dei portatili:


* [[Debian on an HP nx8220 | Debian on an HP nx8220]]
for f in *.txt; do mv "$f" "${f/%txt/log}"; done
* [[Debian on a presario 2141EU | Compaq Presario 2100 (2141EU)]]
* [[Debian on a compaq Presario 2154EA | Compaq Presario 2100 (2154EA)]]
* [[Debian on a Toshiba Satellite M30X-113| Toshiba M30x-113]] ''(stub)''
* [[Debian on a HP Compaq NX6110| HP Compaq NX6110]]
* [[Debian on an HP pavilion zv5422EA| HP pavilion zv5000 (zv5422EA)]]


===Altro===
==Link==
* [[Powernowd: CpuScaling per AMD]]
Link ad altre risorse su '''GNU Bash''':
* [[Cpufreqd: Cpuscaling per Intel Pentium M]]
* Inserire qui anche link a risorse in italiano sui portatili


==Knoppix==
* [http://www.gnu.org/software/bash/manual/bash.html Bash Referece Manual]: manuale ufficiale
* [[Rimasterizzare una knoppix]]
* [http://www.tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]: la '''Bibbia''' dello bash scripting.


==Crittografia==
----
* [[Crittografia e Steganografia - L'Arte di nascondere le informazioni]]
* [[Chiavi simmetriche e chiavi pubbliche]]


==Varie==
Autore iniziale: [[Utente:TheNoise|~ The_Noise]]
* [[Debian Fun]]

Versione delle 14:20, 20 dic 2005

Intro

GNU Bash è la shell *nix probabilmente più ricca di funzionalità sia per l'uso interattivo che per lo scripting. Spesso però molte funzioni sono poco note.

Questa pagina ha lo scopo di raccogliere il più ampio numero di "trucchi" più o meno noti riguardanti Bash, senza avere peraltro la pretesa di coprire tutte le funzionalità.

Per iniziare

Prima di iniziare non posso non segnalare altre due guide presente sul wiki che danno dei tip molto utili su Bash:

Shell Interattiva

In questa sezione verranno elencate funzionalità riguardanti l'uso interattivo di Bash.

Navigare velocemente tra le directory

  • Per andare sulla propria home basta digitare il comando cd senza nessun paramentro.
  • Per tornare indietro alla precedente directory visitata è sufficiente il comando cd -
  • E possibile salvare un percorso con pushd e richiamarlo con popd. In realtà questi comandi (come il nome può fare intuire) implementano una coda FIFO (First In First Out) nella quale è possibile memorizzare un numero illimitato di percorsi per poi richiamarli dall'ultimo inserito in poi. Usare questi comadi è semplicissimo: basta usare pushd al posto di cd (in tal modo si memorizzano i percorsi via via visitati) e poi digitare popd una o più volte per tornare indietro.

Riutilizzo degli argomenti

Bash memorizza l'ultimo argomento del comando precedente in una speciale variabile chiamata $_. E' possibile fare riferimento all'ultimo argomento dell'ultimo comando usando direttamente $_ ma la via di gran lunga più veloce è comoda è usare 'ESC .'.

Ecco un esempio stupido, creare un directory ed entrarvi:

$ mkdir /usr/local/nuovo-programma
$ cd ESC.

Altro esempio forse un pò più utile, creare velocemente uno script:

$ :> /usr/local/bin/nomescript
$ chmod +x ESC.
$ gvim ESC.

Editing della linea di comando

Alcuni tasti di scelta rapida per l'editing da linea di comando:

CTRL+a: Vai all'inizio delle linea
CTRL+e: Vai alla fine della linea
CTRL+k: Cancella fino dalla posizione corrente alla fine della linea
CTRL+u: Cancella fino dalla posizione corrente all'inizio della linea
CTRL+l: Pulisce lo schermo
META+f: Vai una parola avanti
META+b: Vai una parola indietro
META+d: Cancella la parola successiva
META+backspace: Cancella la parola precedente
Info.png Nota sul tasto META
Il tasto Meta può essere usato premendo ALT e contemporaneamente il carattere del comando che interessa, oppure premendo ESC e successivamente il tasto del comando che interessa. In quest'ultimo modo non è necessario permere due tasti conemporaneamente. Questa è una regola generica per gli shortcut di bash che usano il tasto Meta.


Uso avanzato dello storico

Come noto Bash memorizza gli ultimi (solitamente 500 ma il numero è impostabile in $HISTSIZE) comandi digitati ai quali è possibile accedere semplicemente con le freccette SU e GIU. Tuttavia è possibile effettuare molte altre operazioni per ricercare nello storico dei comandi.

Ricerca incrementale inversa

Sotto questo astruso nome si cela la possibilità di ricercare nello storico dei comandi semplicemente premendo CRTL+r e digitando qualche carattere del comando cercato. Verrà immendiatamente mostrato l'ultimo comando che soddisfa i criteri di ricerca. Se più comandi soddisfano la ricerca è possibile scorrerli (dall'ultimo al primo) premendo nuovamente CTRL+r.

Una volta trovato il comando lo si può eseguire con INVIO oppure editare con CTRL+j.

Ricerca nella cronologia

Altra possibilità è cercare tra tutti i comandi precedenti che cominciano con un certo gruppo di lettere.

Questa funzionalità non è abilitata di default; bisogna modificare il file /etc/inputrc (o creare un analogo file .inputrc nella propria home), aggiungendo le righe:

# PgUp/Down searches history in bash
"\e[5~":        history-search-backward
"\e[6~":        history-search-forward

In questo esempio si è scelto di usare i tasti PGUP e PGDOWN. Da notare che il file inputrc contiene altre comodità pronte all'uso: basta decommentarle!

Accesso diretto

Il carattere ! permette di richiamare un preciso comando dello storico:

$ !-3

richiama ed esegue il terzultimo comando, mentre:

$ !ta

richiama ed esgue l'ultimo comando che comincia con ta (potrebbe essere: tail -f /var/log/messages). Il !! richiama invece l'ultimo comando.

Se si vuole richiamare il comando ma non eseguirlo si può usare il modificatore :p (print), ad esempio

$ !ta:p

stampa l'ultimo comando che inizia con ta.

Per richiamare l'ultimo comando che contiene una certa parola (non all'inizio):

$ !?parola?

E' possibile anche richiamare un parametro di un comando usando : seguito dal numero del parametro (0 indica il comando stesso). Ad esempio:

$ man !-1:0

visualizza la pagina di manuale dell'ultimo comando.

Per eseguire un comando con gli stessi argomenti del comando precedente:

$ nuovocomando !!:*

Per ulteriori informazioni sull'uso interattivo dello storico si rimanda all'apposita sezione del manuale di riferimento:

Bash Scripting

In questa sezione verranno elencati alcuni brevi tip per lo scripting Bash. Questa non vuole essere assolutamente una guida completa, ma piùttosto un elenco di costrutti per lo scripting bash particolarmente eleganti, curiosi e/o poco noti.

Variabili speciali

$?
Contiene il valore di uscita dell'ultimo comando o funzione. Il comando ha successo se ritorna zero, qualsiasi altro valore indica invece un codice di errore.
$@
Contiene la lista dei paramentri passati allo script corrente. Ogni parametro viene opportunamente quotato e questo permette l'utilizzo di questa variabile nei cicli for per processare (ad esempio) una lista di nomi di file che possono contenere anche spazi. L'uso di questa variabile è quindi in genere consigliato rispetto a $* che ha la stessa funzione ma non quota i vari parametri.

Esempio:

FILES=$@

for file in $FILES; do
    # Fare quello che si vuole con $file
    echo $file   
    # ...
done
$$
PID del processo corrente.
$!
PID dell'ultimo job in background

Manipolazione delle stringhe

Nelle shell *nix, storicamente, la manipolazione delle stringhe viene fatto attraverso programmi esterni alla shell come seq, awk e perl. Questi programmi vengono ancora usati quando si vuole mantenere la compatibilità con la shell sh, tuttavia imparare anche il solo sed (il più semplice dei tre) non è cosa immediata.

Se si usa Bash, non è necessario usare nessun programma esterno, ma basta imparare i tre operatori fondamentali ed alcuni concetti di base, per poter fare tutte le manipolazioni più comuni.

In Bash una stringa non è altro che una variabile, si indica dunque con ${nome} oppure con la forma abbreviata $nome. Il nome dentro le graffe può essere seguito da un modificatore che manipola la variabile, ad esempio:

 VAR="stringa-di-esempio"
 echo ${VAR#stringa-}

elimina "stringa-" dall'inizio della variabile.

I modificatori sono molti, ma possono essere facilmente ricordati se si imparano i tre fondamentali:

#
sottrae dall'inizio della stringa (minimale)
%
sottrae dalla fine della stringa (minimale)
/
sostituisce una sottostringa con un altra (solo la prima volta che viene incontrata)

Questi operatori sono minimali, questo vuol dire che se si usano le espressioni regolari per indicare la sottostringa (da eliminare o sostituire) verrà individuata in caso di ambiguità la sottostringa più piccola (o solo la prima nel caso della sostituzione).

Per ottenere gli operatori massimali basta raddoppiare il simbolo:

##
sottrae dall'inizio della stringa (massimale)
%%
sottrae dalla fine della stringa (massimale)
//
sostituisce una sottostringa con un altra (tutte le volte che viene incontrata)

Gli operatori massimali cercano di individuare la sottostringa più grande che corrisponde all'espressione regolare (nel caso del modificatore // tutte le sottostringhe vengono sostituite). Gli operatori di questo tipo vengono comunemente chiamati anche greedy (ingordi).

Per una spiegazione dettagliata di tutti i modificatori e anche di altri modi di manipolare le stringhe in Bash (ad esempio expr) vedere:

Esempi: manipolazione delle stringhe

 VAR="questa.sarebbe.una.stringa.di.esempio"
 
                     # Risultato:
 
 echo ${VAR#*.}      # --> sarebbe.una.stringa.di.esempio
 echo ${VAR##*.}     # --> esempio
 
 echo ${VAR%.*}      # --> questa.sarebbe.una.stringa.di
 echo ${VAR%%.*}     # --> questa
 
 echo ${VAR/st/ST}   # --> queSTa.sarebbe.una.stringa.di.esempio
 echo ${VAR//st/ST}  # --> queSTa.sarebbe.una.STringa.di.esempio

Alternativa a basename

Quando in uno script ci si deve riferire al nome dello script stesso è usuale utilizzare il comando (esterno a bash) basename. Tuttavia, tramite i modificatori del paragrafo precedente, Bash stessa è in grado di fornire questa funzionalità. Basta usare l'espressione ${0##*/}.

Esempio:

usage () {
        echo "usage: ${0##*/} "
        exit 1
}

Cambiare l'estensione ai file

Rinomina tutti i file *.txt della directory corrente in *.log:

for f in *.txt; do mv "$f" "${f/%txt/log}"; done

Link

Link ad altre risorse su GNU Bash:


Autore iniziale: ~ The_Noise