Ответы:
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 bash
bash
в текущем каталоге, он tail
быстро завершает работу.Таким образом, конечный результат, скорее всего, закончился там сессией вашего терминала.
#
что это символ комментария для grub anway#!/bin/cat
, тоже должен сработать. (