日期:2014-05-16  浏览次数:20738 次

shell awk- print问题
照着书上抄了段代码,是shell脚本加载字符设备模块,但是有一句话老是出错,希望帮分析下

shell:
 device="test_dev"
major=‘cat /proc/devices | awk "\\$2==\"$device\" {print \\$1}"’
mknod /dev/${device} c ${major} 0
书上是这么写的,不知到写那么多 \反斜杠有什么用?还有运行shell的时候总是会报错: mknod: 额外的操作数 "|"

我将上面的指令直接在终端中输入试了下,
major='cat /proc/devices | awk "\\$2==\"test_dev\" {print \\$1}"'
正常输出之后又会出现这样错误:
cat: |: 没有那个文件或目录
cat: awk: 没有那个文件或目录
cat: "\\$2==\"test_dev\": 没有那个文件或目录
cat: {print: 没有那个文件或目录
cat: \\$1}": 没有那个文件或目录

我尝试将 \ 斜杠去掉,major='cat /proc/devices | awk "$2=="test_dev" {print $1}"'
结果和上面差不多:
cat: |: 没有那个文件或目录
cat: awk: 没有那个文件或目录
cat: "$2=="test_dev": 没有那个文件或目录
cat: {print: 没有那个文件或目录
cat: $1}": 没有那个文件或目录

可是在 /dev目录下 设备驱动 /dev/test_dev 是确实存在的阿!
不知到这个指令怎么改才能正确实现搜索到该设备的主设备号阿?


------解决方案--------------------
放在命令行,应该是这样:
cat /proc/devices |awk ' $2 == "test_dev" {print $1}'
找/proc/devices 下设备名为test_dev的id
实际上是没有的
cat /proc/devices看看有哪些,比如:
cat /proc/devices |awk ' $2 == "raw" {print $1}'
就会有结果

在shell脚本中,\反斜杠一般用作转义字符,那些$符号等都需要转义
man mknod可以看到用法
一般执行是:
mknod console c 5 1 
console为设备文件名,自己随便取 
c是指字符型设备 (可选b,块设备) 
5是主设备号 /dev/devices里面记录现有的设备 
找个没有用的就可以了 
1是次设备号,当你要给两个同样的设备上一个驱动的时候就要分了,从0开始,1就是第二个了 ,对于字符设备,次设备号就表示同类型设备的不同设备。

而你写的脚本,我认为错了,设备都没有怎么获取设备id,然后再创建。。这个脚本没看懂
------解决方案--------------------
不会shell 觉得‘ 应该是反引号 不是单引号

mknod的方法真是过时了啊
------解决方案--------------------
探讨
如果是反单引号,在脚本里那句话就是错的,所以LZ看的书有错,或者LZ没看仔细