Какую логику использует команда «exec tail -n +3 $ 0» из конфигурации grub2?

8

Создавая пользовательский пункт меню, застрял на этой команде:

exec tail -n +3 $0

Попробовал в терминале, получил странный результат, не может понять, что именно делает эта команда и зачем она нужна grub. Не могли бы вы объяснить, пожалуйста?

Imajou
источник

Ответы:

10

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также есть комментарий, говорящий пользователю

Просто введите пункты меню, которые вы хотите добавить после этого комментария.

ilkkachu
источник
FWIW, прищурившись и предполагая, #что это символ комментария для grub anway #!/bin/cat, тоже должен сработать. (
Ульрих Шварц
11

Если вы говорите о /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
  • Предполагается, что этот файл является «простым способом добавления пользовательских пунктов меню» - вы просто вписываете ту конфигурацию 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быстро завершает работу.

Таким образом, конечный результат, скорее всего, закончился там сессией вашего терминала.

Мур
источник