奇怪的 udev 规则行为

奇怪的 udev 规则行为

我正在尝试了解 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"

编辑:作为伊克拉贝指出,两个原始版本在逻辑上从来不是等价的。

相关内容