Que lógica tem o comando “exec tail -n +3 $ 0” do grub2 config?

6

Criando uma entrada de menu personalizada, ficou preso neste comando:

exec tail -n +3 $0

Tentei no terminal, obtive resultados estranhos, não consegui entender, o que exatamente esse comando faz e por que o grub precisa disso. Você poderia explicar, por favor?

    
por Imajou 28.01.2018 / 12:28

2 respostas

9

tail -n +3 imprime sua entrada, começando na linha 3 ( página do manual ) . $0 é o nome do script em um script de shell ( Bash parâmetros especiais ) e exec ( Bash construído ) substitui o script pelo comando. Você provavelmente tem algo assim (como em /etc/grub.d/40_custom no meu sistema):

#!/bin/sh
exec tail -n +3 $0
foo
bar

Quando você executa o script, ele se substitui por tail lendo o próprio script, então o restante do script é copiado para sua saída.

Eu acho que o grub tem um monte de scripts para criar sua configuração, eles executaram algo como grubscript.sh > grub-config-file . Os scripts podem usar qualquer lógica necessária para produzir a saída, mas o truque exec tail permite despejar algumas linhas fixas na saída sem alterar a lógica com a qual o script foi iniciado.

Além desse encantamento mágico, o /etc/grub.d/40_custom do Debian também inclui um comentário dizendo ao usuário para

Simply type the menu entries you want to add after this comment.

    
por 28.01.2018 / 12:55
11

Se você está falando sobre /etc/grub.d/40_custom :

$ cat /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

Em seguida, observe que:

  • este é um script de shell e é executado por grub-mkconfig para construir a configuração do GRUB
  • esse arquivo é supostamente "uma maneira fácil de adicionar entradas de menu personalizadas" - basta digitar exatamente a configuração do GRUB desejada.

Mas este é um script de shell, então normalmente você teria que fazer algo como echo "menuentry ...." etc. Para evitar isso, a exec tail magic é usada. O que isso faz? $0 , lembre-se, é o nome do script como executado, então normalmente seria 40_custom (ou /etc/grub.d/40_custom , etc. dependendo de onde e como foi executado). Portanto, o script está essencialmente executando tail em si mesmo, mas com -n +3 , que informa tail para iniciar a partir da terceira linha.

O que você ganha se você produzir tudo a partir da terceira linha em /etc/grub.d/40_custom ?

# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

(E, além disso, o que mais você colocar abaixo disso)

A parte exec substitui o shell que está executando o script com tail , de forma que nada mais eficaz do script é executado.

Executando no terminal:

  • $0 é provavelmente bash ou algo parecido (pode ser /bin/bash )
  • e por causa do exec , você está substituindo o shell em execução por tail -n+3 bash
  • e, como você provavelmente não tem um arquivo chamado bash em seu diretório atual, tail é encerrado imediatamente.

Assim, o resultado final é provável que a sua sessão de terminal tenha terminado aí.

    
por 28.01.2018 / 12:58