1 760
contributi
(→Tabella Software: nuovi inserimenti (solo nomi)) |
(→Audio player: inseriti link) |
||
Riga 1: | Riga 1: | ||
==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 | 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: | |||
* [[Come abilitare il completamento automatico 'avanzato']] | |||
* [[Colorare bash]] | |||
In | ==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 i '''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 | |||
Il | {{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. | |||
== | ====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 sottisfa 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: | |||
<pre> | |||
# PgUp/Down searches history in bash | |||
"\e[5~": history-search-backward | |||
"\e[6~": history-search-forward | |||
</pre> | |||
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: | |||
<pre> | |||
$ !-3 | |||
</pre> | |||
richiama ed esegue il terzultimo comando, mentre: | |||
<pre> | |||
$ !ta | |||
</pre> | |||
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 !!:1* | |||
</pre> | |||
==Bash Scripting== | |||
* [http://www. | 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. | ||
* [http://www. | |||
* [http://www. | ===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:'' | |||
<pre> | |||
FILES=$@ | |||
for file in $FILES; do | |||
# Fare quello che si vuole con $file | |||
echo $file | |||
# ... | |||
done | |||
</pre> | |||
; $$ : PID del processo corrente. | |||
; $! : PID dell'ultimo job in background | |||
===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 Bash stessa � in grado di fornire questa funzionalit� usando la l'espressione ${0##*/}. | |||
Esempio: | |||
<pre> | |||
usage () { | |||
echo "usage: ${0##*/} " | |||
exit 1 | |||
} | |||
</pre> | |||
=== Cambiare l'estensione ai file === | |||
Rinomina tutti i file <tt>*.txt</tt> della directory corrente in <tt>*.log</tt>: | |||
for f in *.txt; do mv "$f" "${f/%txt/log}"; done | |||
Per una panoramica completa sulla manipolazione delle stringhe in bash: | |||
* [http://www.tldp.org/LDP/abs/html/string-manipulation.html Advanced Bash-Scripting Guide: Manipulating Strings] | |||
==Link== | |||
Link ad altre risorse su '''GNU Bash''': | |||
* [http://www.gnu.org/software/bash/manual/bash.html Bash Referece Manual]: manuale ufficiale | |||
* [http://www.tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]: la '''Bibbia''' dello bash scripting. | |||
---- | |||
Autore iniziale: [[Utente:TheNoise|~ The_Noise]] |
contributi