Quale logica ha il comando “exec tail -n +3 $ 0” dalla configurazione di grub2?


8

Creando una voce di menu personalizzata, mi sono bloccato su questo comando:

exec tail -n +3 $0

L'ho provato nel terminale, ho ottenuto risultati strani, non riesco a capire cosa fa esattamente questo comando e perché grub ne ha bisogno. Potresti spiegare, per favore?

Risposte:


10

tail -n +3stampa 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_custommio sistema):

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

Quando si esegue lo script, questo si sostituisce con la taillettura 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-fileo qualcosa per avere effetto. Gli script potrebbero usare qualsiasi logica di cui hanno bisogno per produrre l'output, ma il exec tailtrucco 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_custominclude anche un commento che dice all'utente

Digita semplicemente le voci di menu che desideri aggiungere dopo questo commento.


FWIW, strizzare gli occhi e supporre che #sia un personaggio commento per grub anway, #!/bin/catdovrebbe funzionare anche. (Avrai comunque la riga dei commenti di shebang nell'output.)
Ulrich Schwarz,

11

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:

  • questo è uno script di shell, ed è eseguito da grub-mkconfigper costruire la configurazione di GRUB
  • questo file dovrebbe essere "un modo semplice per aggiungere voci di menu personalizzate": basta digitare esattamente qualsiasi configurazione GRUB desiderata.

Ma questo è uno script di shell, quindi di solito dovresti fare qualcosa di simile, echo "menuentry ...."ecc. Per evitarlo, exec tailviene 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 tailsu se stesso, ma con -n +3, che dice taildi 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 execparte 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 basho qualcosa del genere (potrebbe essere /bin/bash)
  • e a causa di exec, stai sostituendo la shell in esecuzione contail -n+3 bash
  • e poiché probabilmente non hai un file chiamato bashnella tua directory corrente, tailsi chiude immediatamente.

Quindi è probabile che il risultato finale sia terminato lì.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.