Bash tips: differenze tra le versioni

→‎Bash Scripting: aggiunto tip
(→‎Bash Scripting: aggiunto tip)
Riga 1: Riga 1:
==Intro==
{{stub}}
'''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.
== Disclaimer ==


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�.
Questa guida guida si prefigge di raccogliere informazioni riguardo udev, la sua configurazione e il suo utilizzo dal punto di vista dell'utente su sistemi Debian GNU/Linux.


==Per iniziare==
Molte delle informazioni sono tratte (e tradotte) da <tt>/usr/share/doc/udev/</tt>. Si prega di correggere o segnalare ogni possibile (e probabile) inesattezza.
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']]
== Cos'� udev ==
* [[Colorare bash]]


==Shell Interattiva==
In parole povere, udev � il metodo usato dai kernel 2.6 per creare i device file (quelli in /dev) per le periferiche presenti sul sistema. Tramite delle regole (udev rules) si possono assegnare nomi fissi a determinati dispositivi (a prescindere, ad esempio, dalla porta usata per collegare la periferica). Inoltre � possibile richiamre un certo programma/script non appena un dispositivo viene riconosciuto dal sistema.
In questa sezione verranno elencate funzionalit� riguardanti l'uso interattivo di Bash.


===Navigare velocemente tra le directory===
Udev non si occupa tuttavia di caricare i moduli necessari al funzionamento del dispositivo, infatti questi devono essere gi� caricati per permettere ad udev di riconoscere la periferica e creare il corrispondente device file.
* 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===
Hotplug veniva (fino a poco tempo fa) usato per caricare i driver delle periferiche.
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:
== Il nuovo udev ==
<pre>
$ mkdir /usr/local/nuovo-programma
$ cd ESC.
</pre>


Altro esempio forse un p� pi� utile, creare velocemente uno script:
Dalla versione 0.070 in puoi udev ha sostituito completamente hotplug. I driver delle periferiche vengono caricati tutti automaticamente durante il boot. Per fare un esempio, se al boot vengono trovate delle porte usb, verr� automaticamente caricato il modulo <tt>usb-storage</tt> che permetter� (tra le altre cose) di usare eventuali chiavette usb.
<pre>
$ :> /usr/local/bin/nomescript
$ chmod +x ESC.
$ gvim ESC.
</pre>


===Editing della linea di comando===
Per usare questa versione di udev � necessario un kernel 2.6.12 o superiore con le opzioni hotplug (CONFIG_HOTPLUG) e tmpfs (CONFIG_TMPFS) attivate. Le opzioni CONFIG_PNP, CONFIG_ISAPNP, CONFIG_PNPBIOS e CONFIG_PNPACPI sono altamente raccomandate per consentire il caricamente automatico di importanti driver.
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.}}
Il pacchetto hotplug deve essere rimosso manualmente, anche se non dovrebbe creare problemi se restasse installato.


===Uso avanzato dello storico===
Si pu� disabilitare udev aggiungendo al boot il parametro del kernel <tt>UDEV_DISABLED=yes</tt> in grub o lilo. Alternativamente si pu� configurare in <tt>/etc/udev/udev.conf</tt> una directory diversa da <tt>/dev</tt> per la creazione dei device file.
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====
== Come funziona udev ==
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.
Quando un driver viene caricato, rende disponibili delle informazioni in <tt>/sys</tt> e udev viene eseguito per leggerle e creare il device file appropriato.


Una volta trovato il comando lo si pu� eseguire con INVIO oppure editare con CTRL+j.
Quando si collega una nuova periferica viene generato un evento di hotplug che viene intercettato non pi� da <tt>/sbin/hotplug</tt> bens� da <tt>/sbin/udevsend</tt> (il gestore degli eventi hotplug � indicato in <tt>/proc/sys/kernel/hotplug</tt>).


====Ricerca nella cronologia====
Questo significa che:
Altra possibilit� � cercare tra tutti i comandi precedenti che cominciano con un certo gruppo di lettere.
* i moduli non possono essere caricati su richiesta quando un'applicazione cerca di aprire un suo dispositivo, perch� il dispositivo non c'� ancora!


Questa funzionalit� non � abilitata di default; bisogna modificare il file /etc/inputrc (o creare un analogo file .inputrc nella propria home), aggiungendo le righe:
* poich� i moduli non vengono caricati su richiesta, se per qualche motivo i driver non possono essere caricati automaticamente durante il boot, bisogner� aggiungerli ad /etc/modules (oppure usare modconf ;-)).


<pre>
* alcuni moduli non sono dei driver di un dispositivo e non possono essere caricati automaticamente da udev, devono quindi essere elencati in /etc/modules anch'essi.
# 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.
* alcuni driver non sono stati ancora portati su sysfs, e udev non sar� in grado di creare i loro device. Se si usa uno di questi driver � necessario creare il device dopo ogni boot.
Da notare che il file inputrc contiene altre comodit� pronte all'uso: basta decommentarle!


====Accesso diretto====
In altre parole, su un tipico sistema si potrebbero dover caricare manualmente (usando /etc/modules) dei moduli come ppdev e tun.
Il carattere ! permette di richiamare un preciso comando dello storico:


<pre>
== Da hotplug a udev ==
$ !-3
</pre>


richiama ed esegue il terzultimo comando, mentre:
Nel passaggio da hotplug a udev i seguenti file di configurazione sono diventati obsoleti:


<pre>
; <tt>/etc/hotplug/*.rc</tt> e <tt>*.agent</tt>: i vecchi file di hotplug non vengono pi� usati. Le regole di udev in <tt>/etc/udev/rules.d/</tt> possono essere usate per disabilitare selettivamente il coldplugging.
$ !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.
; <tt>/etc/hotplug/usb/*.usermap</tt>: devono essere sostituiti da regole udev.


Se si vuole richiamare il comando ma non eseguirlo si pu� usare il modificatore :p (''print''), ad esempio
; <tt>/etc/hotplug/blacklist*</tt>: dovrebbero essere sostituite da direttive di configurazione di modprobe (ma per adesso modprobe processer� <tt>/etc/hotplug/blacklist.d/</tt>).


<pre>
== La directory <tt>/etc/udev/rules.d/</tt> ==
$ !ta:p
</pre>


stampa l'ultimo comando che inizia con ''ta''.
I file vengono letti e processati in ordine alfabetico, e le direttive contenute nelle regole vengono applicate in ordine. Le uniche eccezioni sono gli attributi NAME, di cui viene considerato solo il primo.


Per richiamare l'ultimo comando che contiene una certa parola (non all'inizio):
Poich� l'ordine � importante, alcuni di questi file hanno un nome particolare, per far s� che vengano letti prima o dopo di altri, e devono essere opportunamente considerati quando si aggiungono regole personalizzate.


<pre>
Fino ad ora sono stati definiti:
$ !?parola?
</pre>


E' possibile anche richiamare un parametro di un comando usando ''':''' seguito dal numero del parametro (0 indica il comando stesso). Ad esempio:
; <tt>020_permissions.rules</tt>: imposta proprietario e permessi di default.


<pre>
; <tt>z50_run.rules</tt>: viene eseguito <tt>$REMOVE_CMD</tt>, e successivamente l'elaborazione dei device tty viene fermato con <tt>last_rule</tt>.
$ man !-1:0
</pre>


visualizza la pagina di manuale dell'ultimo comando.
; <tt>z70_hotplugd.rules</tt>: le opzioni di <tt>last_rule</tt> finiscono di processare gli eventi hotplug riguardanti "drivers" e "module" e vengono eseguiti i vecchi script in <tt>hotplug.d/</tt> e <tt>dev.d/</tt>.


Per eseguire un comando con gli stessi argomenti del comando precedente:
L'uso di <tt>/etc/udev/rules.d/</tt> da parte di altri pacchetti � fortemente sconsigliato, eccetto quando si aggiungono solamente regole RUN.


<pre>
== Link ==
$ nuovocomando !!:1*
</pre>


==Bash Scripting==
Altri link di approfondimento:
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.debian-administration.org/articles/126 Card Readers and USB keys using udev]
 
* [http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html udev Homepage]
===Variabili speciali===
* [http://www.reactivated.net/udevrules.php Writing udev rules]
 
; $? : 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>
 
==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]]
1 760

contributi