在 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 命令所做的基本上就是打印传递给它的字符串数组。
具体来说,如果你看 common/cli_simple.c
从当前 (7/29/15) u-boot 的 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
多次,以便扩展所有嵌套的环境变量。
关于shell - U-Boot:如何在另一个环境变量中评估一个环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31712609/