70-persistent-net.rules脚本的说明


1

我是脚本语言的新手,我想了解别人编写的脚本,请向我解释以下这行脚本的作用:

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"

Answers:


1

首先,脚本中已经定义了一个变量$ var。我们不知道它是什么,但可能是MAC地址。

脚本行/etc/udev/rules.d/70-persistent-net.rules通过“管道”机制将grep命令的内容输出到命令。其输出是:仅包含$ var值的行。假定这仅是一行。然后处理这一行sed:输出其后的值NAME=。最后,该tr命令去除双引号。

其结果是值eth0eth1,具体取决于$ var的值。然后将该结果分配给变量$ IF。因此,此行脚本的含义是:将$ IF设置为MAC地址为$ var的接口的名称。


如此全面对您来说是一件好事。我想用户也可以通过访问tldp.org并浏览各种教程而受益。
Scott Goodgame 2014年

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

简短说明

这行脚本将保存文本eth0或将其保存eth1到变量中IF。这完全取决于变量内部的内容var

cat将显示该文件的内容,grep将搜索和输出包含内的文本行varsed将删除一切从该行的开始到之后的部分NAME=tr删除所有报价"

该变量var最有可能包含一个MAC地址,该行的重点是提取该MAC地址的接口。您grep输入包含MAC地址的行,然后开始删除一些东西(使用sedtr),最后只剩下接口。

详细说明

这是一个细分:

  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 $vargrep是一种用于搜索内容的工具。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
    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.