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.
#
es ein Kommentarcharakter für Grub Anway ist,#!/bin/cat
sollte auch funktionieren. (Sie haben jedoch die Shebang-Kommentarzeile in der Ausgabe.)Wenn Sie sprechen über
/etc/grub.d/40_custom
: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 dieexec 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 Fall40_custom
(oder/etc/grub.d/40_custom
usw., je nachdem, wo und wie es ausgeführt wurde). Das Skript läuft also im Wesentlichentail
auf sich selbst, aber mit-n +3
, was besagttail
, dass ab der dritten Zeile begonnen werden soll.Was bekommen Sie, wenn Sie alles ab der dritten Zeile ausgeben
/etc/grub.d/40_custom
?(Und zusätzlich, was Sie sonst noch darunter setzen.)
Der
exec
Teil ersetzt die Shell, die das Skript ausführt, durchtail
, sodass effektiv nichts weiter vom Skript ausgeführt wird.Ausführen im Terminal:
$0
ist wahrscheinlichbash
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 dastail
Programm sofort beendet.Das Endergebnis ist also wahrscheinlich, dass Ihre Terminalsitzung dort beendet wurde.
quelle