¿Qué lógica tiene el comando "exec tail -n +3 $ 0" de grub2 config?

8

Al crear una entrada de menú personalizada, se atascó en este comando:

exec tail -n +3 $0

Lo probé en la terminal, obtuve un resultado extraño, no puedo entender qué hace exactamente este comando y por qué grub lo necesita. ¿Podría explicar, por favor?

Imajou
fuente

Respuestas:

10

tail -n +3imprime su entrada, comenzando en la línea 3 ( página de manual ). $0es el nombre del script en un script de shell ( parámetros especiales de Bash ) y exec( Bash builtins ) reemplaza el script con el comando. Probablemente tenga algo como esto (como en /etc/grub.d/40_custommi sistema):

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

Cuando ejecuta el script, se reemplaza con la taillectura del script, por lo que el resto del script se copia a su salida.

Creo que grub tiene un montón de scripts para crear su configuración, probablemente se ejecutan como grubscript.sh >> grub-config-fileo algo para llevar a cabo. Los scripts podrían usar cualquier lógica que necesiten para producir la salida, pero el exec tailtruco permite volcar algunas líneas fijas en la salida sin cambiar la lógica con la que se inicia el script.

Además de ese encantamiento mágico, Debian /etc/grub.d/40_customtambién incluye un comentario que le dice al usuario que

Simplemente escriba las entradas del menú que desea agregar después de este comentario.

ilkkachu
fuente
FWIW, entrecerrar los ojos y asumir que #es un personaje de comentario para grub anway, también #!/bin/catdebería funcionar. (Sin embargo, tendrá la línea de comentarios shebang en la salida).
Ulrich Schwarz
11

Si estás hablando 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.

Entonces tenga en cuenta que:

  • Este es un script de shell y se ejecuta grub-mkconfigpara construir la configuración de GRUB
  • se supone que este archivo es "una manera fácil de agregar entradas de menú personalizadas", simplemente escriba exactamente la configuración de GRUB que desee.

Pero este es un script de shell, por lo que normalmente tendrías que hacer algo como echo "menuentry ...."etc. Para evitar eso, exec tailse usa la magia. Que hace eso $0, recuerde, es el nombre de la secuencia de comandos ejecutada, por lo que normalmente sería 40_custom(o /etc/grub.d/40_custom, etc., dependiendo de dónde y cómo se ejecutó). Entonces, el script se ejecuta esencialmente tailen sí mismo, pero con -n +3, que le indica tailque comience desde la tercera línea.

¿Qué obtienes si envías todo desde la tercera línea en adelante /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.

(Y además, cualquier otra cosa que ponga debajo de esto).

La execparte reemplaza el shell con el que se ejecuta el script tail, por lo que efectivamente no se ejecuta nada más lejos del script.


Ejecutándolo en la terminal:

  • $0es probablemente basho algo así (podría ser /bin/bash)
  • y debido a execeso, estás reemplazando el shell contail -n+3 bash
  • y dado que probablemente no tenga un archivo nombrado bashen su directorio actual, tailsalga rápidamente.

Por lo tanto, el resultado final es probable que su sesión de terminal haya terminado allí.

muru
fuente