Welche Logik hat der Befehl "exec tail -n +3 $ 0" von grub2 config?

8

Beim Erstellen eines benutzerdefinierten Menüeintrags blieb dieser Befehl hängen:

exec tail -n +3 $0

Versuchte es im Terminal, bekam seltsames Ergebnis, kann nicht verstehen, was dieser Befehl genau macht und warum Grub es braucht. Könnten Sie das bitte erklären?

Imajou
quelle

Antworten:

10

tail -n +3druckt seine Eingabe ab Zeile 3 ( Manpage ). $0ist der Name des Skripts in einem Shell-Skript ( Bash-Spezialparameter ) und exec( Bash Builtins ) ersetzt das Skript durch den Befehl. Sie haben wahrscheinlich so etwas (wie in /etc/grub.d/40_custommeinem System):

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

Wenn Sie das Skript ausführen, ersetzt es sich selbst durch das tailLesen des Skripts selbst, sodass der Rest des Skripts in seine Ausgabe kopiert wird.

Ich denke, grub hat eine Reihe von Skripten, um seine Konfiguration zu erstellen. Sie werden wahrscheinlich als grubscript.sh >> grub-config-fileoder etwas ausgeführt, das bewirkt werden soll. Die Skripte könnten jede Logik verwenden, die sie zur Erzeugung der Ausgabe benötigen, aber der exec tailTrick erlaubt es, nur einige feste Zeilen in der Ausgabe zu speichern, ohne die Logik zu ändern, mit der das Skript gestartet wird.

Zusätzlich zu dieser magischen Beschwörung enthält Debian /etc/grub.d/40_customauch einen Kommentar, der den Benutzer dazu auffordert

Geben Sie einfach die Menüeinträge ein, die Sie nach diesem Kommentar hinzufügen möchten.

ilkkachu
quelle
FWIW, das hart blinzelt und annimmt, dass #es ein Kommentarcharakter für Grub Anway ist, #!/bin/catsollte auch funktionieren. (Sie haben jedoch die Shebang-Kommentarzeile in der Ausgabe.)
Ulrich Schwarz
11

Wenn Sie sprechen über /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.

Beachten Sie dann Folgendes:

  • Dies ist ein Shell-Skript, das ausgeführt wird grub-mkconfig, um die GRUB-Konfiguration zu erstellen
  • Diese Datei soll "eine einfache Möglichkeit sein, benutzerdefinierte Menüeinträge hinzuzufügen" - Sie geben einfach genau die gewünschte GRUB-Konfiguration ein.

Aber dies ist ein Shell-Skript, daher müsste man normalerweise so etwas wie echo "menuentry ...."usw. tun . Um dies zu vermeiden, wird die exec tailMagie verwendet. Was macht das? $0Denken Sie daran, dass der Name des Skripts so ausgeführt wird, wie er ausgeführt wird. Dies ist normalerweise der Fall 40_custom(oder /etc/grub.d/40_customusw., je nachdem, wo und wie es ausgeführt wurde). Das Skript läuft also im Wesentlichen tailauf sich selbst, aber mit -n +3, was besagt tail, dass ab der dritten Zeile begonnen werden soll.

Was bekommen Sie, wenn Sie alles ab der dritten Zeile ausgeben /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.

(Und zusätzlich, was Sie sonst noch darunter setzen.)

Der execTeil ersetzt die Shell, die das Skript ausführt, durch tail, sodass effektiv nichts weiter vom Skript ausgeführt wird.


Ausführen im Terminal:

  • $0ist wahrscheinlich bashoder so ähnlich (es könnte sein /bin/bash)
  • und wegen der execersetzen Sie die laufende Shell durchtail -n+3 bash
  • und da Sie wahrscheinlich keine Datei bashin Ihrem aktuellen Verzeichnis haben, wird das tailProgramm sofort beendet.

Das Endergebnis ist also wahrscheinlich, dass Ihre Terminalsitzung dort beendet wurde.

muru
quelle