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



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

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

当我运行这个命令时:

echo ${kernelfile}

我得到这个输出:

${filepath}/uImage.bin

然而,我希望它改为像这样评估文件路径变量:

myimages/uImage.bin

如何做到这一点?

目前,这无法用u-boot echo和shell来完成。这是因为您看到的echo宏替换是在echo命令启动之前由u-boot命令行解释器执行的。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,它传递给执行argv[0]中命令的cmd_process

有趣的部分是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,以便展开所有嵌套的环境变量。

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

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

然后执行:

run set_kernelfile; echo ${kernelfile}

最新更新