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

8

Criando entrada de menu personalizada, ficou preso neste comando:

exec tail -n +3 $0

Tentei no terminal, obtive um resultado estranho, não consigo entender, o que esse comando exatamente faz e por que o grub precisa dele. Você poderia explicar, por favor?

Imajou
fonte

Respostas:

10

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

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

Quando você executa o script, ele se substitui pela tailleitura do próprio script, para que o restante do script seja copiado para sua saída.

Eu acho que o grub tem um monte de scripts para criar sua configuração, eles provavelmente são executados como grubscript.sh >> grub-config-fileou algo para efetuar. Os scripts podem usar qualquer lógica necessária para produzir a saída, mas o exec tailtruque permite apenas despejar algumas linhas fixas na saída sem alterar a lógica na qual o script é iniciado.

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

Basta digitar as entradas do menu que você deseja adicionar após este comentário.

ilkkachu
fonte
FWIW, apertando os olhos com força e assumindo que #é um caractere de comentário para o grub, também #!/bin/catdeve funcionar. (Você terá a linha de comentário shebang na saída, no entanto.)
Ulrich Schwarz
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.

Então observe que:

  • este é um script de shell e é executado grub-mkconfigpara criar a configuração do GRUB
  • esse arquivo deve ser "uma maneira fácil de adicionar entradas de menu personalizadas" - basta digitar exatamente a configuração do GRUB desejada.

Mas esse é um script de shell, então geralmente você precisa fazer algo assim, echo "menuentry ...."etc. Para evitar isso, a exec tailmágica é usada. O que isso faz? $0, lembre-se, é o nome do script como executado, normalmente seria 40_custom(ou /etc/grub.d/40_custometc.), dependendo de onde e como foi executado. Portanto, o script está essencialmente rodando tailem si mesmo, mas com -n +3, o que indica tailpara começar a partir da terceira linha.

O que você ganha se produzir tudo da terceira linha em diante /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, tudo o que você colocar abaixo disso.)

A execparte substitui o shell com o qual tailo script está sendo executado; portanto, nada mais do script é executado.


Executando-o no terminal:

  • $0é provavelmente bashou algo parecido (poderia ser /bin/bash)
  • e por causa disso exec, você está substituindo o shell em execução portail -n+3 bash
  • e como você provavelmente não possui um arquivo nomeado bashno diretório atual, é tailencerrado imediatamente.

Portanto, é provável que o resultado final tenha terminado sua sessão no terminal.

muru
fonte