Respostas:
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.
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:
grub-mkconfigpara criar a configuração do GRUBMas 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)exec, você está substituindo o shell em execução portail -n+3 bashbashno diretório atual, é tailencerrado imediatamente.Portanto, é provável que o resultado final tenha terminado sua sessão no terminal.
#é 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.)