Я новичок в языке сценариев. Мне хотелось бы понять сценарий, который был написан кем-то другим. Пожалуйста, объясните мне, что делает эта строка сценария:
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"
Во-первых, существует переменный $var, уже определенный в сценарии. Мы не знаем, каково это, но это - вероятно, MAC-адрес.
строка сценария производит содержание /etc/udev/rules.d/70-persistent-net.rules
через механизм "канала" к эти grep
команда. Вывод этого: просто строки, которые содержат значение $var. Это, как предполагается, одна строка только. Эту строку тогда рассматривают sed
: это производит значение, которое прибывает после NAME=
. Наконец, эти tr
команда снимает изоляцию с двойных кавычек.
результатом этого является или значение eth0
или eth1
, в зависимости от значения $var. Этот результат тогда присвоен переменному $IF. Таким образом, значение этой строки сценария: $IF набора к названию интерфейса с $var MAC-адреса.
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
) заканчиваться только с интерфейсом в конце.
Вот разбивка:
IF=`(somecommandhere)`
: это означает, "сохраняют вывод somecommandhere
"к названной переменной IF
.
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"
|
это - символ вертикальной черты, что означает, "берут вывод команды перед каналом и делают это входом команды после канала". Так вывод cat
команда будет входом grep
команда. Второй канал будет означать вывод grep
команда будет входом sed
команда, и так далее.
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"
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"
tr -d '"'
: tr
также инструмент командной строки, который может удалить или перевести текст. Это означает, удаляют все двойные кавычки "
. Вывод в этом заключительном этапе:
eth0