Quelle est la logique de la commande "exec tail -n +3 $ 0" de la configuration de grub2?

8

Création d'une entrée de menu personnalisée, coincé sur cette commande:

exec tail -n +3 $0

Je l'ai essayé dans le terminal, j'ai obtenu un résultat étrange, je ne peux pas comprendre ce que fait exactement cette commande et pourquoi grub en a besoin. Pourriez-vous expliquer, s'il vous plaît?

Imajou
la source

Réponses:

10

tail -n +3imprime son entrée, en commençant à la ligne 3 ( page de manuel ). $0est le nom du script dans un script shell ( paramètres spéciaux Bash ) et exec( Bash builtins ) remplace le script par la commande. Vous avez probablement quelque chose comme ça (comme /etc/grub.d/40_customsur mon système):

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

Lorsque vous exécutez le script, il se remplace par la taillecture du script lui-même, de sorte que le reste du script est copié sur sa sortie.

Je pense que grub a un tas de scripts pour créer sa configuration, ils sont probablement exécutés en tant que grubscript.sh >> grub-config-fileou quelque chose à effectuer. Les scripts peuvent utiliser n'importe quelle logique dont ils ont besoin pour produire la sortie, mais l' exec tailastuce permet de simplement vider certaines lignes fixes dans la sortie sans changer la logique avec laquelle le script est démarré.

En plus de cette incantation magique, Debian /etc/grub.d/40_custominclut également un commentaire disant à l'utilisateur de

Tapez simplement les entrées de menu que vous souhaitez ajouter après ce commentaire.

ilkkachu
la source
FWIW, plissant les yeux et supposant qu'il #s'agit d'un caractère de commentaire pour grub anway, #!/bin/catdevrait également fonctionner. (Vous aurez cependant la ligne de commentaires shebang dans la sortie.)
Ulrich Schwarz
11

Si vous parlez de /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.

Notez ensuite que:

  • ceci est un script shell, et est exécuté par grub-mkconfigpour construire la configuration GRUB
  • ce fichier est censé être "un moyen facile d'ajouter des entrées de menu personnalisées" - il vous suffit de taper exactement la configuration GRUB que vous souhaitez.

Mais ceci est un script shell, donc vous devez généralement faire quelque chose comme echo "menuentry ...."etc. Pour éviter cela, la exec tailmagie est utilisée. Qu'est-ce que ça fait? $0, rappelez-vous, est le nom du script tel qu'il est exécuté, il le serait donc généralement 40_custom(ou /etc/grub.d/40_custom, etc., selon l'endroit et la manière dont il a été exécuté). Ainsi, le script s'exécute essentiellement tailsur lui-même, mais avec -n +3, qui indique tailde commencer à partir de la troisième ligne.

Qu'obtenez-vous si vous sortez tout à partir de la troisième ligne /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.

(Et en plus de tout ce que vous mettez en dessous.)

La execpartie remplace le shell qui exécute le script tail, donc rien de plus éloigné du script n'est exécuté.


L'exécuter dans le terminal:

  • $0est probablement bashou quelque chose comme ça (ça pourrait être /bin/bash)
  • et à cause de cela exec, vous remplacez le shell en cours d'exécution partail -n+3 bash
  • et comme vous n'avez probablement pas de fichier nommé bashdans votre répertoire actuel, tailquittez rapidement.

Le résultat final est donc probable que votre session de terminal se soit terminée là.

muru
la source