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.
然后我将实验重命名为somv 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.
(因为具有更高词法等级的规则文件名具有优先权-手册中的另一个歧义)