2012-12-19 4 views
6

Ho letto questa riga di script nel libro [driver di periferica linux]. Qualcuno potrebbe aiutare a spiegare cosa fa (forse qualche parola in dettaglio)?Significato di questa riga di script shell con awk

major=$(awk "\\$2= =\"$module\" {print \\$1}" /proc/devices) 

come in context:

#!/bin/sh 
module="scull" 
device="scull" 
mode="664" 

# invoke insmod with all arguments we got 
# and use a pathname, as newer modutils don't look in . by default 

/sbin/insmod ./$module.ko $* || exit 1 


# remove stale nodes 
rm -f /dev/${device}[0-3] 

major=$(awk "\\$2= =\"$module\" {print \\$1}" /proc/devices) 

mknod /dev/${device}0 c $major 0 
.... 
+1

Qualunque libro che hai letto che, masterizzarlo. Almeno metà delle righe in questo script hanno almeno un bug su ciascuna di esse e il modo in cui invoca l'awk è semplicemente ridicolo. –

+0

@EdMorton consiglia gentilmente un libro sostitutivo ... –

+0

Per shell: Shell Scripting Recipes di Chris Johnson. Per awk: efficace Awk Programming di Arnold Robbins. –

risposta

2

Ho letto anche questo, ma quella linea non funzionava per me. Ho dovuto modificarlo per

major=$(awk "\$2 == \"$module\" {print \$1}" /proc/devices) 

La prima parte \$2 == \"$module\" è il modello. Quando questo è soddisfatto, cioè la seconda colonna è uguale a "scull", viene eseguito il comando print \$1 che stampa la prima colonna. Questo valore è memorizzato nella variabile major. Il numero $ deve essere preceduto da escape in quanto devono essere inoltrati in quanto è da awk.

+0

No !!! Non posso credere che sia stata accettata come risposta corretta! Vedere la risposta corretta da @Guru –

+0

@EdMorton non è una spiegazione errata del codice come dato, quindi va bene. – cmh

+1

@ cmh - questo mi ricorda la barzelletta sul ragazzo che si perde nella nebbia a Seattle, quindi si è avvicinato a un edificio chiedendo dove si trovava e la risposta che ha ottenuto è "in macchina". Data quell'informazione, riuscì a trovare la strada di casa perché sapeva che, avendo appena ricevuto una risposta perfettamente corretta e perfettamente inutile, doveva trovarsi nell'edificio della Microsoft. Interpretare il codice buggy senza correggerlo non è utile IMHO. –

1

/proc/devices contiene i dispositivi configurati carattere e blocco per ciascun modulo.

Espansione alcune variabili nel vostro contesto, e che fissa l'errore di sintassi nella uguaglianza, il comando è simile al seguente:

awk '$2=="scull" {print $1}' /proc/devices 

Questo significa "se il valore della seconda colonna è scull, quindi l'uscita prima colonna. "

Questo comando viene eseguito in una subshell - $(...) - e l'output è assegnato alla variabile $major.

La spiegazione dello scopo è in the book:

Lo script per caricare un modulo che è stato assegnato un numero di dinamica può, quindi, essere scritto utilizzando uno strumento come awk per recuperare informazioni da /proc/devices al fine per creare i file in /dev.

Si noti che in the distributed examples, la riga in scull_load corrisponde alla correzione di Vivek.

+0

grazie cbuckley, risposta molto approfondita. – user1559625

7

Un modo migliore per scrivere questo potrebbe essere:

major=$(awk -v mod=$module '$2==mod{print $1}' /proc/devices) 
+0

+1 Stavo solo scrivendo qualcosa di simile. Questo è il modo corretto per passare shell vars a awk. – Steve

+0

@Guru buono a sapersi, ed è più pulito. – user1559625

+0

+1 Quasi corretto, basta citare la variabile della shell: 'mod =" $ module "'. –