shell - U-Boot:如何在另一个环境变量中评估一个环境变量

标签 shell embedded environment-variables bootloader u-boot

在 U-Boot 中,我有这两个环境变量:

filepath=myimages
kernelfile=${filepath}/uImage.bin

当我运行此命令时:
echo ${kernelfile}

我得到这个输出:
${filepath}/uImage.bin

但是,我希望它改为像这样评估文件路径变量:
myimages/uImage.bin

如何做到这一点?

最佳答案

就目前而言,这无法通过 u-boot echo 完成。和 shell 现在。这是因为您看到的宏替换为 echoecho 之前由 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 的字符串数组,给你一个 argvargc它传递给 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/

相关文章:

python - 如何从 bash shell 执行 .py 脚本

bash - 在 shell 脚本之间共享变量

c++ - 在使用模板的c++中核心类型不同的不同项目中使用通用代码

c++ - qt creator可以使用环境变量吗?

linux - 在用户提示检查中使用多行 ssh 命令时出现 Shell 错误

java - 我可以将 shell 脚本保留在 java 项目中吗

embedded - 解码时间最短的视频格式

embedded - ICSP SendCommand header 中第 4 位的 TDO 是什么意思? (PIC32MX、ICSP 2 线 4 相)

python - 在Python程序中使用Linux环境变量

c# - 如何设置 ASPNETCORE_ENVIRONMENT 以考虑发布 ASP.NET Core 应用程序