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_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}
在 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_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}