Ответы:
tail -n +3печатает ввод, начиная со строки 3 ( справочная страница ). $0является именем сценария в сценарии оболочки ( специальные параметры Bash ) и exec( встроенные функции Bash ) заменяет сценарий командой. Возможно, у вас есть что-то вроде этого (например, в /etc/grub.d/40_customмоей системе):
#!/bin/sh
exec tail -n +3 $0
foo
bar
Когда вы запускаете скрипт, он заменяет себя tailчтением самого скрипта, поэтому остальная часть скрипта копируется в его вывод.
Я думаю, что у grub есть куча скриптов для создания своего конфига, они, вероятно, выполняются как- grubscript.sh >> grub-config-fileто или что-то для воздействия. Сценарии могут использовать любую логику, необходимую для создания выходных данных, но exec tailхитрость позволяет просто сбросить некоторые фиксированные строки в выходных данных без изменения логики, с которой запускается сценарий.
В дополнение к этому волшебному заклинанию, в Debian /etc/grub.d/40_customтакже есть комментарий, говорящий пользователю
Просто введите пункты меню, которые вы хотите добавить после этого комментария.
Если вы говорите о /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.
Затем обратите внимание, что:
grub-mkconfigдля построения конфигурации GRUBНо это сценарий оболочки, поэтому обычно вам приходится делать что-то подобное echo "menuentry ...."и т. Д. Чтобы избежать этого, используется exec tailмагия. Что это делает? $0Запомните, это имя скрипта как выполненного, поэтому обычно оно будет 40_custom(или /etc/grub.d/40_customи т. д. в зависимости от того, где и как он был запущен). Таким образом, скрипт по сути работает tailсам по себе, но с -n +3, который говорит tailначинать с третьей строки.
Что вы получаете, если вы выводите все, начиная с третьей строки /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.
(И дополнительно все, что вы положили ниже этого.)
Эта execчасть заменяет оболочку, с которой выполняется сценарий tail, поэтому фактически ничего от сценария не выполняется.
Запуск его в терминале:
$0возможно bashили что-то подобное (это может быть /bin/bash)exec, вы заменяете работающую оболочку наtail -n+3 bashbashв текущем каталоге, он tailбыстро завершает работу.Таким образом, конечный результат, скорее всего, закончился там сессией вашего терминала.
#что это символ комментария для grub anway#!/bin/cat, тоже должен сработать. (