Antworten:
tail -n +3
druckt seine Eingabe ab Zeile 3 ( Manpage ). $0
ist 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_custom
meinem System):
#!/bin/sh
exec tail -n +3 $0
foo
bar
Wenn Sie das Skript ausführen, ersetzt es sich selbst durch das tail
Lesen 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-file
oder 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 tail
Trick 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_custom
auch einen Kommentar, der den Benutzer dazu auffordert
Geben Sie einfach die Menüeinträge ein, die Sie nach diesem Kommentar hinzufügen möchten.
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:
grub-mkconfig
, um die GRUB-Konfiguration zu erstellenAber dies ist ein Shell-Skript, daher müsste man normalerweise so etwas wie echo "menuentry ...."
usw. tun . Um dies zu vermeiden, wird die exec tail
Magie verwendet. Was macht das? $0
Denken 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_custom
usw., je nachdem, wo und wie es ausgeführt wurde). Das Skript läuft also im Wesentlichen tail
auf 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 exec
Teil ersetzt die Shell, die das Skript ausführt, durch tail
, sodass effektiv nichts weiter vom Skript ausgeführt wird.
Ausführen im Terminal:
$0
ist wahrscheinlich bash
oder so ähnlich (es könnte sein /bin/bash
)exec
ersetzen Sie die laufende Shell durchtail -n+3 bash
bash
in Ihrem aktuellen Verzeichnis haben, wird das tail
Programm sofort beendet.Das Endergebnis ist also wahrscheinlich, dass Ihre Terminalsitzung dort beendet wurde.
#
es ein Kommentarcharakter für Grub Anway ist,#!/bin/cat
sollte auch funktionieren. (Sie haben jedoch die Shebang-Kommentarzeile in der Ausgabe.)