Respostas:
tail -n +3
imprime 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_custom
meu sistema):
#!/bin/sh
exec tail -n +3 $0
foo
bar
Quando você executa o script, ele se substitui pela tail
leitura 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-file
ou algo para efetuar. Os scripts podem usar qualquer lógica necessária para produzir a saída, mas o exec tail
truque 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_custom
també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-mkconfig
para 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 tail
mágica é usada. O que isso faz? $0
, lembre-se, é o nome do script como executado, normalmente seria 40_custom
(ou /etc/grub.d/40_custom
etc.), dependendo de onde e como foi executado. Portanto, o script está essencialmente rodando tail
em si mesmo, mas com -n +3
, o que indica tail
para 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 exec
parte substitui o shell com o qual tail
o script está sendo executado; portanto, nada mais do script é executado.
Executando-o no terminal:
$0
é provavelmente bash
ou algo parecido (poderia ser /bin/bash
)exec
, você está substituindo o shell em execução portail -n+3 bash
bash
no diretório atual, é tail
encerrado 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/cat
deve funcionar. (Você terá a linha de comentário shebang na saída, no entanto.)