Risposte:
tail -n +3
stampa il suo input, iniziando dalla riga 3 ( pagina man ). $0
è il nome dello script in uno script di shell ( parametri speciali di Bash ) e exec
( built-in di Bash ) sostituisce lo script con il comando. Probabilmente hai qualcosa del genere (come nel /etc/grub.d/40_custom
mio sistema):
#!/bin/sh
exec tail -n +3 $0
foo
bar
Quando si esegue lo script, questo si sostituisce con la tail
lettura dello script stesso, quindi il resto dello script viene copiato nel suo output.
Penso che grub abbia un sacco di script per creare la sua configurazione, probabilmente sono eseguiti come grubscript.sh >> grub-config-file
o qualcosa per avere effetto. Gli script potrebbero usare qualsiasi logica di cui hanno bisogno per produrre l'output, ma il exec tail
trucco consente di scaricare solo alcune linee fisse nell'output senza cambiare la logica con cui lo script è iniziato.
Oltre a quell'incantesimo magico, Debian /etc/grub.d/40_custom
include anche un commento che dice all'utente
Digita semplicemente le voci di menu che desideri aggiungere dopo questo commento.
Se stai parlando di /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.
Quindi notare che:
grub-mkconfig
per costruire la configurazione di GRUBMa questo è uno script di shell, quindi di solito dovresti fare qualcosa di simile, echo "menuentry ...."
ecc. Per evitarlo, exec tail
viene usata la magia. Che cosa fa? $0
, ricorda, è il nome dello script come eseguito, quindi in genere sarebbe 40_custom
(o /etc/grub.d/40_custom
, ecc. a seconda di dove e come è stato eseguito). Quindi lo script è essenzialmente in esecuzione tail
su se stesso, ma con -n +3
, che dice tail
di iniziare dalla terza riga.
Cosa si ottiene se si emette tutto dalla terza riga in poi /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 inoltre qualsiasi altra cosa tu metta sotto questo.)
La exec
parte sostituisce la shell con cui viene eseguito lo script tail
, quindi effettivamente non viene eseguito nulla di più dallo script.
Eseguendolo nel terminale:
$0
è probabilmente bash
o qualcosa del genere (potrebbe essere /bin/bash
)exec
, stai sostituendo la shell in esecuzione contail -n+3 bash
bash
nella tua directory corrente, tail
si chiude immediatamente.Quindi è probabile che il risultato finale sia terminato lì.
#
sia un personaggio commento per grub anway,#!/bin/cat
dovrebbe funzionare anche. (Avrai comunque la riga dei commenti di shebang nell'output.)