![grub.cfg 中 [ x$feature_... = xy ] 的文档在哪里?](https://linux22.com/image/1141094/grub.cfg%20%E4%B8%AD%20%5B%20x%24feature_...%20%3D%20xy%20%5D%20%E7%9A%84%E6%96%87%E6%A1%A3%E5%9C%A8%E5%93%AA%E9%87%8C%EF%BC%9F.png)
我无法使用 Google 找到 x$feature... 的任何参考,因为它会向我显示示例/boot/grub/grub.cfg
。
在自生成的 grub.cfg 中,有很多
if [ x$feature_platform_search_hint = xy ] ...
if [ x$feature_default_font_path = xy]...
if [ x$feature_all_video_module = xy ]...
我的理解是它正在检查该功能是否存在。我在哪里可以找到每个可用的功能及其描述。
我认为xy
这意味着 true 或 available。您还可以使用哪些其他值?
编辑:我只需要知道中可用的变量/boot/grub/grub.cfg
。最好有文档。
答案1
feature_platform_search_hint
(以及其他)和类似 shell 的语法是normal
中的模块的一个特性grub
。语法在GRUB 手册- 尽管我找不到[]
脚本语言“显然”以 bash 为模型的文档,因为它保留了 bash 中使用的单词(即使尚未实现)(例如[[
)并实现了诸如 之类的 bashism function
。
预定义变量(例如)feature_platform_search_hint
在构建时硬编码在普通模块中,除非研究源代码,否则基本上没有文档记录。在当前版本的 中grub
,这些变量始终定义为y
,因此这些变量似乎表示支持给定 grub 版本的特定功能,并且可以对它们进行测试以编写grub.cfg
适用于多个版本的 grub 的文件。
例如,feature_platform_search_hint=y
似乎表明搜索命令支持--hint-bios
,--hint-efi
等等开关,而没有这个变量可能表明的版本grub
不支持这些开关,因此您不应该尝试search
使用它们执行语句以避免语法错误。
我的回答中有很多猜测和“可能”,因为所有这些似乎基本上都没有记录。
答案2
语法描述如下GRUB 手册语法与 GNU Bash 和其他 Bourne shell 衍生版本非常相似。引用和变量扩展的工作方式与 shell 类似。左括号“ [
”是 GRUB 的同义词测试内置命令。
功能列表作为features
全局变量维护在normal/main.c
.feature_platform_search_hint
自 GRUB 2.00(2012 年发布)以来一直可用。因此,该功能的条件代码检查在所有现代 Linux 发行版中都是毫无意义的。
在撰写本文时,最新添加的功能是feature_timeout_style
,自 2.02-beta1 起可用。
答案3
严格来说,从表达式的角度来看,if [ x$feature_platform_search_hint = xy ]
与没有任何关系grub
,它是一个 shell 表达式,由 shell 解释。grub
在它的一个辅助脚本中使用它,就是这样。
if [ x$feature_platform_search_hint = xy ]
基本上是测试变量是否feature_platform_search_hint
扩展为y
。
如何?
是[
命令的同义词test
(可以是 shell 内置命令或外部命令),用于评估表达式。
在if [ x$feature_platform_search_hint = xy ]
:
[
测试字符串x$feature_platform_search_hint
和xy
是否相同这
x
是一个占位符,虚拟字符串,存在于两边$feature_platform_search_hint
首先扩展变量,将值添加到已经存在的字符串中x
,然后将左侧的字符串与右侧的字符串进行比较=
实际上,它必须检查变量是否
feature_platform_search_hint
有值y
这里的
x
用法是,如果变量feature_platform_search_hint
未设置或为空,那么将因两侧都需要参数[
而退出并出现错误,而如果没有,则会变成:=
feature_platform_search_hint
if [ = y ]
在这种情况下, using
x
可以让我们获得语法正确的用法:if [ x = xy ]
请注意,应该使用-z
测试(测试字符串是否为零长度)或-n
测试(非零长度测试),以最适合者为准:
if [ -n "$feature_platform_search_hint" ]
if [ -z "$feature_platform_search_hint" ]
还应该引用变量(尽管在这种情况下严格来说不是必要的,因为作者可能只想在脚本内部定义/覆盖变量):
if [ x"$feature_platform_search_hint" = xy ]