use*_*535 5 embedded shell environment-variables bootloader u-boot
在U-Boot中,我有以下两个环境变量:
filepath=myimages
kernelfile=${filepath}/uImage.bin
Run Code Online (Sandbox Code Playgroud)
当我运行此命令时:
echo ${kernelfile}
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
${filepath}/uImage.bin
Run Code Online (Sandbox Code Playgroud)
但是,我希望它改为像这样评估filepath变量:
myimages/uImage.bin
Run Code Online (Sandbox Code Playgroud)
怎么能实现这一目标?
目前,使用u-boot echo和shell 无法实现这一点.这是因为在echo启动命令之前,u-boot命令行解释器正在执行您看到的宏替换echo.所有echo命令都基本上打印传递给它的字符串数组.
具体来说,如果你common/cli_simple.c从u-boot的当前(7/29/15)git存储库中查看,你会发现该函数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多次调用,以便扩展所有嵌套环境变量.
小智 5
或者作为一种懒惰的方式,您可以执行以下操作:
filepath=myimages
set_kernelfile= setenv kernelfile ${filepath}/uImage.bin
Run Code Online (Sandbox Code Playgroud)
然后做:
run set_kernelfile; echo ${kernelfile}
Run Code Online (Sandbox Code Playgroud)