Linux udev-与之间的差异+;=以及:=

Linux udev-与之间的差异+;=以及:=,linux,udev,Linux,Udev,我正试图理解udev操作符,以便为我的设备创建规则,但关于操作符的两个在线来源之间似乎存在差异,从而防止以后更改键。哪个udev操作员(如果有)将阻止以后更改钥匙 关于udev运算符的以下两个来源之间似乎存在差异,这会阻止以后更改键 声明+:确保以后的规则不会产生任何效果,但man udev声明:=将最终为键分配一个值;禁止以后进行任何更改。manudev还声明“+=”将向保存条目列表的键添加值。。那么,哪个udev操作符(如果有的话)将阻止以后更改键 我通过为我的USB闪存驱动器创建/etc/

我正试图理解
udev
操作符,以便为我的设备创建规则,但关于操作符的两个在线来源之间似乎存在差异,从而防止以后更改键。哪个
udev
操作员(如果有)将阻止以后更改钥匙

关于udev运算符的以下两个来源之间似乎存在差异,这会阻止以后更改键

声明
+:
确保以后的规则不会产生任何效果
,但
man udev
声明
:=
最终为键分配一个值;禁止以后进行任何更改。
manudev
还声明
“+=”
向保存条目列表的键添加值。
。那么,哪个
udev
操作符(如果有的话)将阻止以后更改键

我通过为我的USB闪存驱动器创建/etc/udev/rules.d/80-test.rules来测试这个问题。该规则具有以下键值行

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added.sh" 
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added_2.sh"
可执行文件
device\u added.sh
包含

`echo "USB device removed  at $(date)" >>/tmp/scripts.log`
`echo "USB device removed  at $(date)" >>/tmp/scripts_2.log`
…可执行文件
device\u added\u 2.sh
包含

`echo "USB device removed  at $(date)" >>/tmp/scripts.log`
`echo "USB device removed  at $(date)" >>/tmp/scripts_2.log`
我注册了对udev的更改:
$sudo udevadm control--reload
然后我插入了USB闪存驱动器。然后我检查了
/tmp/scripts.log
/tmp/scripts\u 2.log
是否已创建并具有相应的字符串,它们确实创建了这些字符串。因此,
+=
似乎并不阻止以后对键进行更改

然后,我测试了
:=
是否通过在规则的第一个密钥对中为
+=
子绑定
:=
来防止以后对密钥进行更改

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN:="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added_2.sh"
然后,我再次向udev注册了更改,拔下USB驱动器,将其插入,然后检查测试日志文件以获取更新。我希望
scripts\u 2.log
不会被更新。然而,它是!因此,似乎
:=
也不能阻止以后对键进行更改

那么,
+=
和/或
:=
操作符能否以某种方式防止以后更改键?是否应该使用其他操作员来防止以后的更改?

似乎
man udev
http://www.reactivated.net/writing_udev_rules.html
这可能是错误的,所以我可能对此有所误解

我希望
:=
阻止
脚本\u 2.log
被更新

更新-2019-05-12: 我发现我问了一个非常相似的问题,但这里提供的两个答案并没有回答这篇文章中的问题。一个答案建议使用
GOTO
,这是我理解的一种变通方法,另一个答案建议使用
:=
,这与前面提到的来源一样,似乎是错误的

更新-2019-05-19: 我刚刚意识到以下陈述,在

…使用
+=
添加
最后一条规则
赋值,这似乎应该与
:=
具有相同的效果。所以,我再次编辑了我的规则以

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN:="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", OPTIONS+="last_rule"
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added_2.sh"

然后,我再次向udev注册了更改,拔下USB驱动器,将其插入,然后检查测试日志文件以获取更新。我希望
scripts\u 2.log
不会被更新,但是它被更新了。因此,
OPTIONS+=“last_rule”
似乎也不能阻止以后对键的更改。

似乎
的文档:=
不完整;它执行所描述的操作,但跨越规则文件。我这样重复了你的实验:

50 udevoptest.rules
中:

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device",  RUN:="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added_2.sh"
在上游另一个名为
73 seat late.rules
的规则文件中,有此规则

TAG=="uaccess", ENV{MAJOR}!="", RUN{builtin}+="uaccess"
现在,我使用
udevadm test/sys/…
测试两个规则集都适用的设备的规则,这让我们:

run: '/bin/device_added.sh'
run: '/bin/device_added_2.sh'
run: 'uaccess'
Unload module index
Unloaded link configuration context.
run: '/bin/device_added.sh'
run: '/bin/device_added_2.sh'
Unload module index
Unloaded link configuration context.
然后我将实验重命名为so
mv 50-udevoptest.rules 99 udevoptest.rules
,然后重复
udevadm test/sys/…
,这让我们:

run: '/bin/device_added.sh'
run: '/bin/device_added_2.sh'
run: 'uaccess'
Unload module index
Unloaded link configuration context.
run: '/bin/device_added.sh'
run: '/bin/device_added_2.sh'
Unload module index
Unloaded link configuration context.
(因为具有更高词法等级的规则文件名具有优先权-手册中的另一个歧义)