在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_macros
,cli_simple_parse_line
基本上取一个字符串并拆分成一个字符串数组,类似于shell的方式,给你一个argv
和argc
,它传递给执行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}