2012-12-19 14 views
6

Ich lese diese Zeile des Skripts in Buch [Linux Gerätetreiber]. Kann jemand erklären, was es tut (vielleicht ein paar Worte im Detail)?Bedeutung dieser Shell-Skript-Zeile mit awk

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

wie in Zusammenhang:

#!/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

Was Buch, das Sie, dass in, brennen Sie es lesen. Mindestens die Hälfte der Zeilen in diesem Skript hat mindestens einen Fehler auf jedem von ihnen und die Art, wie es awk aufruft, ist einfach lächerlich. –

+0

@EdMorton freundlicherweise schlagen ein Ersatzbuch ... –

+0

Für Shell: Shell Scripting Rezepte von Chris Johnson. Für awk: Effektive Awk-Programmierung von Arnold Robbins. –

Antwort

2

Ich lese das auch, aber diese Linie funktionierte nicht für mich. Ich hatte es zu modifizieren, um

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

Der erste Teil \$2 == \"$module\" das Muster ist. Wenn dies erfüllt ist, das heißt, die zweite Spalte ist gleich "scull", wird der Befehl print \$1 ausgeführt, der die erste Spalte druckt. Dieser Wert wird in der Variablen major gespeichert. Die $ muss mit Escapezeichen versehen werden, da sie an awk übergeben werden müssen.

+0

Nein !!! Ich kann nicht glauben, dass dies als die richtige Antwort akzeptiert wurde! Siehe die richtige Antwort von @Guru –

+0

@EdMorton es ist keine falsche Erklärung des Codes als gegeben, so ist es in Ordnung. – cmh

+1

@cmh - das erinnert mich an den Witz über den Kerl, der sich in Seattle im Nebel verlor, also fuhr er zu einem Gebäude und fragte, wo er sei und die Antwort, die er bekam, war "in einem Auto". Mit dieser Information konnte er dann seinen Weg nach Hause finden, da er wusste, dass er, da er gerade eine vollkommen korrekte und vollkommen nutzlose Antwort bekommen hatte, im Microsoft-Gebäude sein musste. Fehlercode zu interpretieren, ohne es zu korrigieren, ist nicht nützlich IMHO. –

1

/proc/devices enthält die aktuell konfigurierten Charakter und Blockgeräte für jedes Modul.

einige Variablen in Ihrem Kontext erweitern und in der Gleichheit der Syntaxfehler Festsetzung, sieht der Befehl wie folgt aus:

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

Das bedeutet „, wenn der Wert der zweiten Spalte scull ist, dann gibt das erste Spalte."

Dieser Befehl wird in einer Subshell Run - $(...) - und die Ausgabe an die variable $major zugeordnet ist.

Die Erklärung der Zweck ist, in the book:

Das Skript, ein Modul zu laden, die eine dynamische Zahl kann daher zugewiesen wurde, geschrieben werden, unter Verwendung eines Werkzeugs, wie beispielsweise awk Informationen von /proc/devices abzurufen, um um die Dateien in /dev zu erstellen.

Beachten Sie, dass in the distributed examples, die Linie in scull_load Viveks Korrektur entspricht.

+0

danke Cbuckley, sehr gründliche Antwort. – user1559625

7

Ein besserer Weg, dies zu schreiben wäre:

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

+1 Ich habe gerade etwas ähnliches geschrieben. Dies ist der richtige Weg, Shell-Vars an awk zu übergeben. – Steve

+0

@ Guru gut zu wissen, und es ist sauberer. – user1559625

+0

+1 Fast korrekt, zitieren Sie einfach Ihre Shell-Variable: 'mod =" $ module "'. –