Respuestas:
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.
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:
grub-mkconfigpara construir la configuración de GRUBPero 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)execeso, estás reemplazando el shell contail -n+3 bashbashen su directorio actual, tailsalga rápidamente.Por lo tanto, el resultado final es probable que su sesión de terminal haya terminado allí.
#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).