Respuestas:
tail -n +3
imprime su entrada, comenzando en la línea 3 ( página de manual ). $0
es 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_custom
mi sistema):
#!/bin/sh
exec tail -n +3 $0
foo
bar
Cuando ejecuta el script, se reemplaza con la tail
lectura 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-file
o algo para llevar a cabo. Los scripts podrían usar cualquier lógica que necesiten para producir la salida, pero el exec tail
truco 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_custom
tambié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-mkconfig
para 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 tail
se 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 tail
en sí mismo, pero con -n +3
, que le indica tail
que 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 exec
parte 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:
$0
es probablemente bash
o algo así (podría ser /bin/bash
)exec
eso, estás reemplazando el shell contail -n+3 bash
bash
en su directorio actual, tail
salga 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/cat
debería funcionar. (Sin embargo, tendrá la línea de comentarios shebang en la salida).