每次 grub-update 后运行脚本

每次 grub-update 后运行脚本

我想在每次 grub-update 后自动运行一个脚本。脚本本身由一行组成

sed -i 's/[\]"!Windows 2006[\]"/"!Windows 2006"/g' /boot/grub/grub.cfg

为此,我编辑了已经存在的文件

/etc/grub.d/40_custom

内容如下:

#!/bin/sh
set -e
sed -i 's/[\]"!Windows 2006[\]"/"!Windows 2006"/g' /boot/grub/grub.cfg

但这似乎不起作用,我不知道原因。

答案1

您需要做的就是添加脚本文件/etc/grub.d并使其可执行。它们按照 shell 扩展顺序执行。

例如,添加如下内容/etc/grub.d/90_my_script

#!/bin/bash
echo this is a test >/home/brian/1
>&2 echo this is stderr output

标准输出似乎已被捕获,但您可以使用记录器将一些内容添加到系统日志,或回显到标准错误。

答案2

update-grub是一个小型的 shell 脚本,它仅grub-mkcnfig使用一些选项调用另一个 shell 脚本:

$ cat /sbin/update-grub
#!/bin/sh
set -e
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"

让我们看一下最后几行grub-mkconfig

if test "x${grub_cfg}" != "x" ; then
  if ! ${grub_script_check} ${grub_cfg}.new; then
    # TRANSLATORS: %s is replaced by filename
    gettext_printf "Syntax errors are detected in generated GRUB config file.
Ensure that there are no errors in /etc/default/grub
and /etc/grub.d/* files or please file a bug report with
%s file attached." "${grub_cfg}.new" >&2
    echo >&2
    exit 1
  else
    # none of the children aborted with error, install the new grub.cfg
    cat ${grub_cfg}.new > ${grub_cfg}
    rm -f ${grub_cfg}.new
  fi
fi

这看起来好像grub-mkconfig创建了一个临时文件/boot/grub/grub.cfg.new,最后检查其语法是否正确,然后复制到/boot/grub/grub.cfg并最后删除。

您不应该使用sed-command,/etc/grub.d/40_custom因为该文件的内容将被复制到新的配置文件中(前两行除外),并且您不希望sed在新的配置文件中使用 -command。

的目的/etc/grub.d/40_custom是添加自定义菜单项,grub.cfg这些菜单项将通过使用exec tail第二行中的 -command 复制到配置文件中。因此 -commandsed将出现在 中grub.cfg,并导致语法错误,因为sed不是有效的 grub 命令。当然,您可以exec tail从 中删除 -command /etc/grub.d/40_custom,但如果您在此处添加了任何自定义菜单项,这不是您想要做的。

/etc/grub.d/相反,按照建议使用不同的文件Brianc 的回答例如/etc/grub.d/90_my_sed_command。不要忘记将文件设为可执行文件(sudo chmod +x /etc/grub.d/90_my_sed_command

并且您需要sed在临时文件上使用命令,/boot/grub/grub.cfg.new而不是使用它,/boot/grub/grub.cfg它是旧的配置文件,并且在语法检查成功后将被新的配置文件覆盖:

sed -i 's/[\]"!Windows 2006[\]"/"!Windows 2006"/g' /boot/grub/grub.cfg.new

我没有检查你的sed命令,如果它以某种方式产生无效的语法,语法检查将失败,旧的将不会被覆盖,你将收到错误消息,你可以在我上面发布的/boot/grub/grub.cfg代码片段中看到该消息。grub-mkconfig


这个问题已经有九年了,这个答案应该对最新版本的 Ubuntu 有效,我在 Ubuntu 22.04.3 上测试了它。

我创建了一个文件 /etc/grub.d/42_sed,内容如下

#!/bin/sh
sed -i s/"'Ubuntu"/"'Ubuntustudio"/ /boot/grub/grub.cfg.new

并使其可执行。我sudo update-grub在备份原始文件后发布了该grub.cfg文件。

menuentry 'Ubuntu (lowlatency)'

在备份的原始配置文件中gub.cfg.bak更改为

menuentry 'Ubuntustudio (lowlatency)'

在新创建的配置文件中grub.cfg。何以证明这一点……

相关内容