U-Boot:如何在另一个环境变量中评估一个环境变量

7

在 U-Boot 中,我有这两个环境变量:

filepath=myimages
kernelfile=${filepath}/uImage.bin

当我运行这个命令时:

echo ${kernelfile}

我收到了以下输出:
${filepath}/uImage.bin

然而,我希望它可以通过以下方式来评估filepath变量:

myimages/uImage.bin

这怎么能实现呢?
2个回答

8
目前来看,使用u-boot的echo和shell无法实现此功能。这是因为你在echo看到的宏替换是在启动echo命令之前由u-boot命令行解释器执行的。实际上,echo命令所做的就是打印传递给它的字符串数组。
具体而言,如果查看当前(7/29/15)u-boot git存储库中的common/cli_simple.c,将会找到函数cli_simple_run_command。该函数传递一个字符串cmd,其中可能包含用;分隔的多个命令。如果查看拆分该字符串的循环内部,将发现cli_simple_process_macros,然后是对cli_simple_parse_line的调用,接着是cmd_process。现在跳过cli_simple_process_macroscli_simple_parse_line基本上将一个字符串划分为类似于shell的字符串数组,给您提供了argvargc,它们传递给cmd_process,该命令执行argv[0]中的命令。
有趣的部分是cli_simple_process_macros。该函数将输入字符串作为第一个参数,输出字符串作为第二个参数。该函数是一个简单的状态机,用于查找u-boot环境变量(或者如函数名称所示的宏),并将其替换为环境变量的值。这可以通过调用getenv和然后复制到输出字符串来实现。如果查看cli_simple_process_macros的工作方式,您会注意到它只进行一次遍历,也就是说,如果一个环境变量包含另一个环境变量,则不处理第二个环境变量,而只是复制字符串值。
最后,如果查看echo命令的源代码,您会发现它非常简单,基本上只是循环遍历传递给它的argv,并使用适当的空格打印每个字符串。
因此,如果要实现所需的行为,您需要更改cli_simple_process_macros以便迭代处理环境变量,或更改echo以查找环境变量。您还可以更改cli_simple_run_command,使其多次调用cli_simple_process_macros,以便扩展所有嵌套的环境变量。

7
或者你可以采用一种简单的方式,就像这样:
filepath=myimages
set_kernelfile= setenv kernelfile ${filepath}/uImage.bin

那么,请执行以下操作:
run set_kernelfile; echo ${kernelfile}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接