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