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

时间:2015-07-29 23:01:48

标签: shell embedded environment-variables bootloader u-boot

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

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

当我运行此命令时:

echo ${kernelfile}

我得到了这个输出:

${filepath}/uImage.bin

但是,我希望它改为像这样评估filepath变量:

myimages/uImage.bin

如何实现这一目标?

2 个答案:

答案 0 :(得分:7)

目前,使用u-boot echo和shell无法实现这一点。这是因为在echo命令启动之前,u-boot命令行解释器正在执行您使用echo看到的宏替换。所有echo命令都基本上打印传递给它的字符串数组。

具体来说,如果你从u-boot的当前(7/29/15)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,以便扩展所有嵌套环境变量。

答案 1 :(得分:4)

或者作为一种懒惰的方式,你可以做这样的事情:

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

然后做:

run set_kernelfile; echo ${kernelfile}