我想在每次 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
。何以证明这一点……