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

U-Boot: How to evaluate one environment variable inside another

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

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

当我运行这个命令时:

echo ${kernelfile}

我得到这个输出:

${filepath}/uImage.bin

但是,我希望它像这样评估文件路径变量:

myimages/uImage.bin

如何实现?

就目前而言,u-boot echo 和 shell 目前无法完成此操作。这是因为在启动 echo 命令之前,u-boot 命令行解释器正在执行您看到的带有 echo 的宏替换。 echo 命令所做的基本上就是打印传递给它的字符串数组。

具体来说,如果您查看当前 (7/29/15) git u-boot 存储库中的 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,以便扩展所有嵌套的环境变量。

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

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

然后做:

run set_kernelfile; echo ${kernelfile}