我正在尝试让 grub2 在特定小时间隔内启动到 Ubuntu,否则启动到 Windows。我尝试通过编辑 /boot/grub/grub.cfg 并更改在 上用作默认操作系统的操作系统来实现此目的set default
。Grub2 在其自己的类似 shell 的脚本语言上运行,并且它没有 bash date +%H
,我可以使用 bash 查看我处于哪个小时并相应地设置默认操作系统。grub 在其上运行的类似 shell 的脚本语言确实具有以下内容:
A日期命令打印如下内容:
2021-03-10 18:36:29 Thursday
以及正则表达式。
我想知道如何使用该regexp
命令以及从命令返回小时的正则表达式是什么date
。
如果您认为还有其他方法可以完成我想做的事情并且更简单,请告诉我。
回答
我的问题是如何使用正则表达式在 grub2 中获取小时,但我想做的是让 grub2 根据时间在正确的操作系统上启动。经过大量研究,我找到了解决这个问题的更好方法。
/boot/grub/grub.cfg
使用您最喜欢的编辑器打开文件。- 搜索
set default
命令。这是定义默认操作系统的命令。 - 删除 else 分支上出现的命令。
- 粘贴此代码。
# My script to boot on Ubuntu when on specific hours
# and days, use 'sudo update-grub' to use default grub.cfg
insmod datehook
if [ ! ("${WEEKDAY}" == "Saturday" -o "${WEEKDAY}" == "Sunday") ]; then
if [ "${HOUR}" -ge 10 -a "${HOUR}" -le 17 ]; then
set default="0"
else
set default="4"
fi
else
set default="4"
fi
- 保存并在下次重新启动时应用这些规则。
关于代码片段
insmod datehook
使以下环境变量可访问:$YEAR
,,,,,,,。$MONTH
$DAY
$HOUR
$MINUTE
$SECOND
$WEEKDAY
要了解 if-else 的语法,您可以参考此链接
我希望这能对将来的某人有所帮助。
答案1
我的发现与你的不同。
具体来说,在 GNU GRUB 手册 2.04 我找到了对两个缺失功能的引用:
Command: date [[year-]month-day] [hour:minute[:second]]
不带参数,打印当前日期和时间。
并且:
Command: regexp [--set [number:]var] regexp string
测试是否为正则表达式正则表达式火柴细绳. 支持的正则表达式是 POSIX.2 扩展正则表达式。如果
--set
给出了选项,则存储数字变量中第 1 个匹配的子表达式变量. 子表达式按照其左括号的顺序从“1”开始编号。数字默认为“1”。
根据此文档,并假设date
返回一个字符串,例如2021-03-19 10:11:12
,那么 regexp 应该跳过 11 个字符并提取接下来的两个字符,因此命令可能如下所示:
regexp --set hour '.{11}(.{2})' "`date`"
如果这像在普通 bash 中一样工作,那么可能会在变量中找到小时
hour
。
但这取决于你去测试和观察,因为有很多未知的地方,比如当小时小于 10 时,它是否仍然有两位数,等等。只有测试才能发现所有这些小细节。