0

我已经开始学习“Linux Device Drivers 3rd ed”,但我无法理解以下脚本的语法。我知道基本的 shell 脚本,并且可以使用 awk 实用程序来制作基本程序

Q1)/sbin/insmod ./$module.ko $* || 退出 1 a) 说明 insmod 的完整路径需要什么?b)我使用 ./ 来调用可执行文件,但从未在命令中间看到 ./。c) 是 $module=scull??? d) $* 是什么意思?e) 双棒是干什么用的?

Q2)major=$(awk "\$2= =\"$module\" {print \$1}" /proc/devices) 这条 awk 语句通过哪些步骤为我们获取 scull 设备?我没有得到双斜杠“\”和双等号。

#!/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
mknod /dev/${device}1 c $major 1
mknod /dev/${device}2 c $major 2
mknod /dev/${device}3 c $major 3
4

2 回答 2

1

第一季度

a) 需要说明 insmod 的完整路径,因为即使您位于 PATH 中未定义的位置,它也始终可以访问
b) ./something 表示某物是位于当前路径中的文件。./$module.ko 表示文件 ./scull.ko
c) 与 b
d) $* 表示您为 shell 脚本提供的任何参数。
e) 双管(或 bat)是指 OR。这意味着,insmod 模块,或者如果失败,退出并返回值 1

我没有 Q2 的答案。对不起。

于 2013-01-08T07:39:36.197 回答
0

A1.a:当环境不包含 $PATH 变量或 $PATH 不包含“/sbin”路径时,需要 insmod 的绝对路径。A1.b:问题在哪里?“./” - 只是相对路径。当您需要从当前目录访问某些文件对象时使用它。在“./”表达式的常见情况下,“点”替换 $(pwd) 命令的输出,但不是更快更短。A1.c:是的,在这个名为“scull”的代码模块中将被加载。什么问题?A1.d:“$*”是一个特殊的shell变量,包含所有传递给这个脚本的参数。A1.d:“||” 是一个逻辑“或”运算符。

我需要阅读一些关于 bash 的内容,例如Advanced Bash-Scripting Guide。本指南前段时间帮助了我。

Q2:

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

在这一行

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

作为分配给“主要”变量的子shell和标准输出运行。在我的 linux 机器中,由于语法错误,这个 awk-command 不起作用,但我在这里认识到 awk-actions。在这种情况下,/proc/devices 的内容被解析,如果第二个单词是等值的“模块”变量,那么将执行大括号中的代码。换句话说,如果该行的第二个单词是“scull”,则打印该行的第一个单词。在我的 linux 框中,这条线工作正常:

major=$(awk "\$2 == \"$module\" {print \$1}" /proc/devices)
于 2013-01-08T08:37:00.763 回答