我正在尝试了解 udev 规则是如何解释的。上下文:使我自己能够以非 root 用户身份访问 USB 扫描仪(我是该scanner
组的成员)。
以下规则确实不是工作:
SUBSYSTEM=="usb_device", ACTION=="add", ATTR{idVendor}=="04a9", ATTR{idProduct}=="190d", SYMLINK+="scan-canon", MODE="0666", OWNER="misha", GROUP="scanner"
然而,以下规则确实有效:
SUBSYSTEM!="usb_device", ACTION!="add", GOTO="canon_rules_end"
ATTR{idVendor}=="04a9", ATTR{idProduct}=="190d", SYMLINK+="scan-canon", MODE="0666", OWNER="misha", GROUP="scanner"
LABEL="canon_rules_end"
这两个版本在逻辑上肯定是等价的吗?我只是不明白为什么更优雅的第一个版本不起作用。有任何想法吗?
答案1
拔了那么多头发之后我就明白了。
事实证明我的扫描仪的子系统实际上是usb
.这就是规则的第一个版本(优雅的版本)失败的原因 - 正如它应该的那样,因为 SUBSYSTEM 不等于usb_device
。
第二个版本可以工作,但出于各种错误的原因。从事编码工作的人会熟悉这种阴险的自我造成的错误。 Udev 将 AND 逻辑应用于指定条件。这意味着,如果任何一个的条件评估为 False,GOTO 将不会被执行,而规则的核心内容将被执行。将否定条件与 AND 逻辑混合在一起是令人讨厌的。
不管怎样,现在我已经修复了第一个版本,它的工作原理与预期完全一样:
SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="04a9", ATTR{idProduct}=="190d", SYMLINK+="scan-canon", MODE="0666", OWNER="misha", GROUP="scanner"
编辑:作为伊克拉贝指出,两个原始版本在逻辑上从来不是等价的。