Я пытаюсь понять операторов udev
, чтобы я мог создавать правила для своего устройства, но, похоже, существует несоответствие между парой онлайн-источников об операторе, которое предотвращает последующее изменение ключей.Какой оператор udev
, если таковой имеется, будет препятствовать последующим изменениям ключей?
Кажется, существует несоответствие между следующими двумя источниками относительно операторов udev, которые предотвращают последующие изменения ключей.
http://www.reactivated.net/writing_udev_rules.html утверждает, что +:
ensures that no later rule can have any effect
, но man udev
утверждает, что :=
будет Assign a value to a key finally; disallow any later changes.
.man udev
также утверждает, что "+="
будет Add the value to a key that holds a list of entries.
.Итак, какой оператор udev
, если таковой будет, помешает последующим изменениям ключей?
Я проверил этот вопрос, создав /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_added.sh
содержит ...
`echo "USB device removed at $(date)" >>/tmp/scripts.log`
... и исполняемый файл device_added_2.sh
содержит ...
`echo "USB device removed at $(date)" >>/tmp/scripts_2.log`
Я зарегистрировал изменения в udev: $ sudo udevadm control --reload
, а затем подключил USB-накопитель.Затем я проверил, были ли созданы /tmp/scripts.log
и /tmp/scripts_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_2.log
НЕ будет обновлено.Тем не менее, это было!Таким образом, кажется, что :=
также НЕ предотвращает последующие изменения ключей.
Таким образом, операторы +=
и / или :=
могут каким-либо образом предотвращать последующие изменения ключей?Есть ли другой оператор, который я должен использовать, чтобы предотвратить последующие изменения?
Кажется маловероятным, что и man udev
, и http://www.reactivated.net/writing_udev_rules.html
будут ошибаться по этому поводу, поэтому я, вероятно, что-то неправильно понимаю по этому поводу.
Я ожидал, что :=
предотвратит обновление scripts_2.log
.
ОБНОВЛЕНИЕ - 2019-05-12: Я обнаружил этот стек Обмен пост задает очень похожий вопрос, но два ответа, представленные там, не отвечают на вопрос в этом посте.В одном ответе предлагается использование GOTO
, что, как я понимаю, является обходным путем, а в другом ответе предлагается использование :=
, которое, как и ранее упомянутые источники, кажется ложным.
ОБНОВЛЕНИЕ - 2019-05-19: Я только что понял, что следующее утверждение в http://www.reactivated.net/writing_udev_rules.html...
Additional options
Another assignment which can prove useful is the OPTIONS list. A few options are available:
all_partitions - create all possible partitions for a block device, rather than only those that were initially detected
ignore_device - ignore the event completely
last_rule - ensure that no later rules have any effect
For example, the rule below sets the group ownership on my hard disk node, and ensures that no later rule can have any effect:
KERNEL=="sda", GROUP="disk", OPTIONS+="last_rule"
... использует +=
для добавления назначения last_rule
,который, кажется, должен иметь тот же эффект, что и :=
.Итак, я снова отредактировал свое правило на ...
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_2.log
НЕ будет обновлено, но это было.Таким образом, похоже, что OPTIONS +="last_rule"
также НЕ препятствует последующим изменениям ключей.