|
|
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]]
| |