在U-Boot中我有两个环境变量:
filepath=myimages
kernelfile=${filepath}/uImage.bin
当我运行此命令时:
echo ${kernelfile}
我得到了这个输出:
${filepath}/uImage.bin
但是,我希望它改为像这样评估filepath变量:
myimages/uImage.bin
如何实现这一目标?
答案 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_macros
,cli_simple_parse_line
基本上会接受一个字符串并拆分成一个类似于shell的字符串数组,为您提供一个argv
和argc
传递给它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}