ENV и ATTR в правилах udev?

Похоже, вы хотите соединить статический список номеров портов с именами серверов, полученными из команды.

Вместо этого сделайте это:

PATH=$MQ_INSTALL_PATH/bin:$PATH

ports=( 60720 60721 60722 60723 60724 )
i=0

dspmq | sed -n '/QMNAME/{ s/.*(\([^)]*\)).*/\1/p; }' |
while read -r server && [ "$i" -lt "${#ports[@]}" ]; do
    printf 'Port on %s is %d\n' "$server" "${ports[i]}"
    i=$(( i+1 ))
done

По сути, это то, что вы пытались сделать, но использовали два вложенных цикла, а не один цикл с комбинированным условием. Код также считывает имена серверов непосредственно из конвейера команд, который создает их, не сохраняя их в промежуточном массиве.

Если вы хотите передать номера портов в обратном порядке, используйте

PATH=$MQ_INSTALL_PATH/bin:$PATH

ports=( 60720 60721 60722 60723 60724 )
i=${#ports[@]}

dspmq | sed -n '/QMNAME/{ s/.*(\([^)]*\)).*/\1/p; }' |
while read -r server && [ "$i" -gt 0 ]; do
    i=$(( i-1 ))
    printf 'Port on %s is %d\n' "$server" "${ports[i]}"
done

Выражение ${#ports[@]}во всех приведенных выше случаях расширяется до количества элементов в массиве ports.

Команда sed

sed -n '/QMNAME/{ s/.*(\([^)]*\)).*/\1/p; }'

извлечет строку в первой скобке из строк, содержащих строку QMNAME. Можно также написать

sed -n '/QMNAME/{ s/.*(//; s/).*//p; }'
2
05.11.2017, 23:43
1 ответ

ENV и ATTR/ATTRS

ATTR{имя файла}
Сопоставьте значения атрибутов sysfs устройства событий.

ATTRS{имя файла}
Найдите в devpath выше устройство с соответствующими значениями атрибута sysfs. Если указано несколько совпадений ATTRS, все они должны совпадать на одном устройстве.

ENV{клавиша}
Сопоставьте со значением свойства устройства.

Если и ENV, и ATTRсодержат одинаковую информацию, -вы можете использовать любой из них, разницы нет.

ENVs для рассматриваемого устройства могут содержать значения, полученные от различных родительских устройств. Таким образом, с ENVвы можете иногда сопоставлять значения с нескольких родительских устройств одновременно, что невозможно с ATTRS.


Правило создания каталога

Вы должны использовать абсолютный путь в клавишеRUN(RUN+="/bin/mkdir /home/pi/heyimhere"в вашем примере):

If no absolute path is given, the program is expected to live in /usr/lib/udev; otherwise, the absolute path must be specified.

Кстати, я не знаю, почему ваше правило выключения работает. Этого не должно быть из-за sbin/shutdownбез ведущего /.


Монтирование из правил udev

Как упоминал jasonwryan , вы не можете использовать udev для автоматического монтирования:

Note that running programs that access the network or mount/unmount filesystems is not allowed inside of udev rules, due to the default sandbox that is enforced on systemd-udevd.service.

0
16.07.2020, 20:21

Теги

Похожие вопросы