grub.cfg 中 [ x$feature_... = xy ] 的文档在哪里?

grub.cfg 中 [ x$feature_... = xy ] 的文档在哪里?

我无法使用 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_hintxy是否相同

  • x是一个占位符,虚拟字符串,存在于两边

  • $feature_platform_search_hint首先扩展变量,将值添加到已经存在的字符串中x,然后将左侧的字符串与右侧的字符串进行比较=

  • 实际上,它必须检查变量是否feature_platform_search_hint有值y

  • 这里的x用法是,如果变量feature_platform_search_hint未设置或为空,那么将因两侧都需要参数[而退出并出现错误,而如果没有,则会变成:=feature_platform_search_hint

    if [ = y ]
    

    在这种情况下, usingx可以让我们获得语法正确的用法:

    if [ x = xy ]
    

请注意,应该使用-z测试(测试字符串是否为零长度)或-n测试(非零长度测试),以最适合者为准:

if [ -n "$feature_platform_search_hint" ]
if [ -z "$feature_platform_search_hint" ] 

还应该引用变量(尽管在这种情况下严格来说不是必要的,因为作者可能只想在脚本内部定义/覆盖变量):

if [ x"$feature_platform_search_hint" = xy ]

相关内容