Объяснение скрипта 70-persistent-net.rules

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

IF=`cat /etc/udev/rules.d/70-persistent-net.rules | grep $var | sed 's/^.*NAME=//' | tr -d '"'`

Вот что в мой 70-persistent-net.rules:

# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:19.0 (e1000e)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:a9", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:1c.5/0000:03:00.0 (e1000e)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:aa", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
1
задан 1 August 2014 в 15:51

2 ответа

Во-первых, существует переменный $var, уже определенный в сценарии. Мы не знаем, каково это, но это - вероятно, MAC-адрес.

строка сценария производит содержание /etc/udev/rules.d/70-persistent-net.rules через механизм "канала" к эти grep команда. Вывод этого: просто строки, которые содержат значение $var. Это, как предполагается, одна строка только. Эту строку тогда рассматривают sed: это производит значение, которое прибывает после NAME=. Наконец, эти tr команда снимает изоляцию с двойных кавычек.

результатом этого является или значение eth0 или eth1, в зависимости от значения $var. Этот результат тогда присвоен переменному $IF. Таким образом, значение этой строки сценария: $IF набора к названию интерфейса с $var MAC-адреса.

1
ответ дан 1 August 2014 в 15:51
IF=`cat /etc/udev/rules.d/70-persistent-net.rules | grep $var | sed 's/^.*NAME=//' | tr -d '"'`

Короткое объяснение

Эта строка сценария идет к любому, сохранили текст eth0 или eth1 в переменную IF. Все это зависит от того, что в переменной var.

cat отобразит содержание файла, grep будет искать и производить строку, которая содержит текст внутри var, sed удалит все с начала строки до того, что прибывает после NAME=, tr удаляет все цитаты ".

Переменная var скорее всего, содержит MAC-адрес, и смысл строки должен извлечь интерфейс того MAC-адреса. Вы grep для строки, которая содержит MAC-адрес и затем Вы начинаете удалять некоторый материал (использование sed и tr) заканчиваться только с интерфейсом в конце.

Долгое объяснение

Вот разбивка:

  1. IF=`(somecommandhere)`: это означает, "сохраняют вывод somecommandhere"к названной переменной IF.

  2. cat /etc/udev/rules.d/70-persistent-net.rules: отобразите содержание файла /etc/udev/rules.d/70-persistent-net.rules. На данном этапе вывод:

    # PCI device 0x8086:/sys/devices/pci0000:00/0000:00:19.0 (e1000e)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:a9", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    
    # PCI device 0x8086:/sys/devices/pci0000:00/0000:00:1c.5/0000:03:00.0 (e1000e)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:aa", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
    
  3. | это - символ вертикальной черты, что означает, "берут вывод команды перед каналом и делают это входом команды после канала". Так вывод cat команда будет входом grep команда. Второй канал будет означать вывод grep команда будет входом sed команда, и так далее.

  4. grep $var: grep инструмент, который ищет что-то. var переменная, которая определяется где-нибудь в Вашем сценарии перед этой строкой.

    Скажем, то, что переменная содержит 00:0b:ab:6a:6b:a9. Так grep $var означает "поиск и производит только строку, которая содержит 00:0b:ab:6a:6b:a9. На данном этапе вывод теперь:

    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:a9", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    
  5. sed 's/^.*NAME=//': sed инструмент командной строки, который может управлять входом, чтобы удалить или заменить некоторый текст.

    Следующее средство части использует этот синтаксис: 's/<replace this>/<with this>/'.

    • Ваш <replace this> ^.*NAME=. Это - шаблон поиска регулярного выражения. Это используется для "соответствования" тексту. Это средство выражения: соответствие с начала строки (^), соответствуйте всему (.*) до NAME=. Таким образом, в основном это - то, что подобрано (полужирный текст):

      SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:a9", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    • Ваш <with this> ничто, таким образом, Вы заменяете текст, Вы ничему не соответствовали. Это в основном означает, что Вы удаляете то, чему Вы соответствовали.

    На данном этапе вывод - это:

    "eth0"
    
  6. tr -d '"': tr также инструмент командной строки, который может удалить или перевести текст. Это означает, удаляют все двойные кавычки ". Вывод в этом заключительном этапе:

    eth0
    
1
ответ дан 1 August 2014 в 15:51

Другие вопросы по тегам:

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