Используя оценку и sed для выполнения подсчета и управления сценарием

Современные ядра Linux поддерживают файл DEVTMPFS Система (не путайте с древними devfs ) , что создает все узлы устройства, как только ядро ​​обнаруживает их. (Фактически, последние релизы требуют этого; вы обнаружите, что UDEV больше не создает узлы устройства, только SymLinks.)

Аналогично, загрузка прошивки была Перемещенные в ядро, а также только оставшиеся задачи UDEV выполняют нагрузку модулей (в соответствии с модальными) и применение разрешений на устройство и другие правила UDEV.

Так что в теории полностью монолитное ядро ​​должно быть загрузки просто отлично без Удева.

Однако настоящая проблема здесь - это то, что происходит позже.

  1. Довольно несколько программ пользователей полагаются на UDEV, поддерживая свою базу данных устройства, доступную через Libudev . Во время перечисления устройств и прослушивания к добавленным / удаленным событиям могут быть выполнены непосредственно с использованием интерфейсов ядра (SYSFS и NETLink), вы все равно останетесь без всех метаданных, которые прикреплены различные правила UDEV.

  2. Правила UDEV также поддерживают различные «настойчивые» симлизованные ссылки в / dev / disk / by - * , / dev / Mapper , / dev / input / by-path , / dev / snd / by-path , и так далее. Например, если у вас подключены два диска, нет никакой гарантии, что первый всегда будет SDA или SDB , но UDEV гарантирует, что SymLinks в / dev / disk / by-uuid продолжит указывать на правильный.

  3. В то время как узлы устройства теперь создаются ядром и, следовательно, не ваша проблема больше, все равно важно отметить, что некоторые типы устройств начали использовать динамически назначенные основные / незначительные числа, поэтому, даже если у вас есть / dev / Предохранитель Как 10 228 и / dev / hpet Как 10,229 сегодня они будут имеют разные числа после каждой перезагрузки, поэтому либо devtmpfs или (на более старых системах ) требуется программа, которая слушает UEVENT, это требуется .

Многие из этих вещей могут быть легко сделаны другими программами, такими как MDEV , конечно. Моя точка зрения является то, что статическое / etc / makedev больше не собирается работать ...


Итак, в основном, когда дело доходит до загрузки сложности, Удев вполне вероятно, что ваших проблем.

0
13.04.2017, 15:36
1 ответ
[117058] Во-первых, так как вы не упомянули об этом, я предполагаю, что это скрипт bash.

Высокий глянец этих двух строк заключается в том, что они извлекают номер заголовка и главы из вывода [117684]lsdvd[117685] и хранят их в массиве с именами [117686]ячеек [117687].

Скорее всего, приведенный код не работает, так как [117688]to_cell=${ячейка[title_num]}[117689] в последней строке должна быть [117690]to_cell=${ячейки[title_num]}[117691].

Вот более подробная разбивка:

Команда [117692]sed[117693] ищет номера, следующие за [117694]Title:[117695] и [117696]Chapters:[117697] в выводе из [117698]lsdvd[117699]. Затем [117700]sed[117701] запоминает эти номера в [117702]\1[117703] и [117704]\2[117705] соответственно. [117706]sed[117707] выводит строку вида [117708]ячеек[$((10#\1))]=$((10#\2))[117709], заменяя обратный слеш на заголовок и номера глав.

Думаю, вас также смущает синтаксис [117710]$((10#x))[117711]. Вот и разбивка: [117712]$((выражение))[117713] в слове bash означает "относиться к [117714] выражению [117715] как к арифметическому выражению и оценивать его", в то время как [117716]y#x[117717] является арифметическим выражением, означающим "относиться к [117718]x[117719] как к базовому [117720]y[117721] числу и преобразовывать его в десятичное число". Так, например, [117722]2#10[117723] вычисляется в [117724]2[117725] (поскольку 10 означает 2 в базе 2), [117726]10#10[117727] вычисляется в [117728]10[117729] (так как преобразование числа 10 в десятичное ничего не делает) и [117730]3#4[117731] выдает ошибку (так как "4" не является юридическим символом в базе 3). Более подробная информация доступна в разделе [117732]ARITHMETIC EVALUATION[117733] в [117734]man bash[117735].

  1. Поэтому команда [117736]sed[117737] просто выводит строку, которая выглядит так: [117738]ячейки[$((10#x))]=$((10#y))[117739], где [117740]x[117741] и [117742]y[117743] - числа. Это передается в [117744]eval[117745]. Думаю, на данный момент вы знаете достаточно, чтобы понять, что вычисление этой строки просто приводит к стандартному присваиванию массивов в bash, так как после вычисления арифметических выражений строка выглядит как [117746]ячейки[x]=y[117747].
  2. Последняя строка - это просто какое-то дополнительное присваивание переменных, с одним трюком. [117748]${#ячейки[@]}[117749] просто вычисляют количество элементов в массиве [117750]ячеек[117751].
  3. В этом вся суть.[117075].
2
28.01.2020, 02:37

Теги

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