我有多个 udev 规则,用于检查 ATTRS{name}=="abc123" 是否存在,并在该设备存在时调用各种函数。这些 udev 规则位于多个位置,因为这是在 bitbake 中为自定义嵌入式操作系统创建的。现在,如果我想更改此设备来测试不同的硬件,则每次更改每个 ATTR{name} 调用都太耗时。
我的解决方案是在某个conf文件中定义一个var,例如$UDEVVAR =“[device_name]”(待定),然后将每个ATTR {name}调用更改为类似ATTR {name} ==“$ {UDEVVAR }”。
我已经在为概念验证而编写的本地规则中测试了这种方法,尽管该规则没有调用。尽管遵循相同的概念,但当地的规则有点不同。无论我拥有什么闪存驱动器,都没有定义 ATTR{name},因此我使用了 USB 鼠标和该闪存驱动器。这个 udev 规则是:
SUBSYSTEM=="${UDEVVAR}", ACTION=="add", RUN+="/usr/local/bin/trigger.sh"
trigger.sh 只是将日期时间戳写入日志文件。当将 SUBSYSTEM 硬编码为 =="block" 时,规则调用成功,但定义 UDEVVAR="block" 时,规则不会被调用。我的想法是,如果有效,那么我将定义 UDEVVAR="hidraw" 来测试鼠标。
我似乎找不到太多关于任何人尝试做这样的事情的文档。我想我犯了某种语法错误,或者也许 udev 规则不允许这样的事情。
我很感激任何帮助!
答案1
解决问题的一种方法是从模板生成文件。
在与开发环境不同的目录树中,创建文件的副本,但将要更改的值替换为,例如
ATTRS{name}="%%NAME%%"
然后,当您需要 "def456" 时,通过运行该文件
sed -e 's/%%NAME%%/def456/'
宏m4
预处理器(man m4;info m4
)对此很方便。
另见man -k template
。