Explicação do script 70-persistent-net.rules

1

Eu sou um novato em linguagem de script. Eu gostaria de entender um script que foi escrito por outra pessoa. Por favor, me explique o que esta linha de script faz:

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

Aqui está o que está nas minhas 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"
    
por Anne Ambe 01.08.2014 / 13:46

2 respostas

1

Primeiro, há uma variável $ var já definida no script. Nós não sabemos o que é, mas é provavelmente um endereço MAC.

A linha de script produz o conteúdo de /etc/udev/rules.d/70-persistent-net.rules através do mecanismo "pipe" para o comando grep . A saída disso é: apenas as linhas que contêm o valor de $ var. Isto é assumido como sendo apenas uma linha. Essa linha é tratada por sed : gera o valor que vem após NAME= . Finalmente, o comando tr retira as aspas duplas.

O resultado disso é o valor eth0 ou eth1 , dependendo do valor de $ var. Este resultado é então atribuído à variável $ IF. Então o significado desta linha de script é: set $ IF para o nome da interface com o endereço MAC $ var.

    
por Jos 01.08.2014 / 15:19
1
IF='cat /etc/udev/rules.d/70-persistent-net.rules | grep $var | sed 's/^.*NAME=//' | tr -d '"''

breve explicação

Esta linha de script salvará o texto eth0 ou eth1 na variável IF . Tudo depende do que está dentro da variável var .

cat exibirá o conteúdo do arquivo, grep pesquisará e exibirá a linha que contém o texto dentro de var , sed excluirá tudo, desde o início da linha até o que vem depois de NAME= , tr exclui todas as cotações " .

A variável var provavelmente contém um endereço MAC, e o ponto principal da linha é extrair a interface desse endereço MAC. Você grep para a linha que contém o endereço MAC e, em seguida, você começa a excluir algumas coisas (usando sed e tr ) para acabar com apenas a interface no final.

Longa explicação

Aqui está um resumo:

  1. IF='(somecommandhere)' : isso significa "salvar a saída de somecommandhere " em uma variável chamada IF .

  2. cat /etc/udev/rules.d/70-persistent-net.rules : exibe o conteúdo do arquivo /etc/udev/rules.d/70-persistent-net.rules . Neste estágio, a saída é:

    # 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. | este é um símbolo de pipe, que significa "pegue a saída do comando antes do pipe e torne a entrada do comando após o pipe". Portanto, a saída do comando cat será a entrada do comando grep . O segundo canal significará que a saída do comando grep será a entrada do comando sed , e assim por diante.

  4. grep $var : grep é uma ferramenta que procura algo. var é uma variável definida em algum lugar no seu script, antes desta linha.

    Digamos que a variável contenha 00:0b:ab:6a:6b:a9 . Portanto, grep $var significa "pesquisar e gerar apenas a linha que contém 00:0b:ab:6a:6b:a9 . Neste estágio, a saída é agora:

    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 é uma ferramenta de linha de comando que pode manipular a entrada, excluir ou substituir algum texto.

    A próxima parte significa usar esta sintaxe: 's/<replace this>/<with this>/' .

    • Seu <replace this> é ^.*NAME= . Este é um padrão de pesquisa de expressão regular. Isso é usado para "combinar" o texto. Essa expressão significa: corresponde do início da linha ( ^ ), corresponde tudo ( .* ) até NAME= . Então, basicamente, isso é o que é correspondido (o texto em negrito):

      SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:a9", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    • Seu <with this> não é nada, então você está substituindo o texto com o qual você combinou nada. Isso basicamente significa que você está excluindo o que você combinou.

    Nesta fase, a saída é esta:

    "eth0"
    
  6. tr -d '"' : tr também é uma ferramenta de linha de comando que pode excluir ou converter texto. Isso significa excluir todas as aspas duplas " . A saída neste estágio final é:

    eth0
    
por Alaa Ali 01.08.2014 / 18:59