2012-12-19 25 views
6

我在本書[linux設備驅動程序]中閱讀了這行腳本。任何人都可以幫助解釋它的作用嗎(可能是一些細節)?這個shell腳本行與awk的含義

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

如在上下文中:

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

無論本書你讀到,在,燒了它。該腳本中至少有一半的行至少有一個錯誤,並且它調用awk的方式只是荒謬的。 –

+0

@EdMorton好心推薦一本替換書... –

+0

For shell:Shell腳本食譜作者:Chris Johnson。對於awk:Arnold Robbins的有效Awk編程。感謝cbuckley –

回答

2

我也讀過這篇文章,但那行不適合我。我不得不修改它

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

第一部分​​是模式。當滿足時,即第二列等於「scull」,執行打印第一列的命令print \$1。該值存儲在變量major中。 $需要轉義,因爲它們需要傳遞給awk。

+0

不!我不相信這被接受爲正確的答案!看到@Guru的正確答案 –

+0

@EdMorton它不是給出的代碼的錯誤解釋,所以沒關係。 – cmh

+1

@cmh--這讓我想起了那個在西雅圖迷霧中迷路的人的笑話,所以他拉上了一棟建築物,問他在哪裏,他得到的答案是「在汽車裏」。鑑於這些信息,他可以找到回家的路,因爲他知道,因爲他只是得到了一個完全正確和完全無用的答案,所以他必須在微軟的大樓裏。解釋錯誤的代碼而不糾正它是沒有用的恕我直言。 –

1

/proc/devices包含每個模塊的當前配置的字符和塊設備。

擴大在上下文中的幾個變量,並在平等固定的語法錯誤,命令如下:

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

這意味着「如果第二列的值是scull,然後輸出第一列「。

該命令在子shell中運行 - $(...) - 輸出分配給變量$major

的目的的解釋是in the book

該腳本來加載是爲了被分配一個動態數從/proc/devices可以,因此,使用工具如awk檢索信息要寫入的模塊在/dev中創建文件。

請注意,在the distributed examples中,scull_load中的行符合Vivek的更正。

+0

,回答很透徹。 – user1559625

7

一種更好的方式來寫,這將是:

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

+1我只是寫了類似的東西。這是將shell變量傳遞給awk的正確方法。 – Steve

+0

@Guru很高興知道,它更乾淨。 – user1559625

+0

+1幾乎正確,只需引用你的shell變量:'mod =「$ module」'。 –