在 U-Boot 中,我有这两个环境变量:
filepath=myimages
kernelfile=${filepath}/uImage.bin
当我运行这个命令时:
echo ${kernelfile}
我收到了以下输出:
${filepath}/uImage.bin
然而,我希望它可以通过以下方式来评估filepath变量:
myimages/uImage.bin
这怎么能实现呢?
在 U-Boot 中,我有这两个环境变量:
filepath=myimages
kernelfile=${filepath}/uImage.bin
echo ${kernelfile}
${filepath}/uImage.bin
然而,我希望它可以通过以下方式来评估filepath变量:
myimages/uImage.bin
echo
和shell无法实现此功能。这是因为你在echo
看到的宏替换是在启动echo
命令之前由u-boot命令行解释器执行的。实际上,echo
命令所做的就是打印传递给它的字符串数组。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
,以便扩展所有嵌套的环境变量。filepath=myimages
set_kernelfile= setenv kernelfile ${filepath}/uImage.bin
run set_kernelfile; echo ${kernelfile}