uBoot 递归变量,我是不是理解错了

问题描述 投票:0回答:1

这感觉就像我误解了一个基本概念:

我的真实案例如下:

setenv nbootcmd .....various options
setenv fbootcmd ..... various options
setenv bootcmd \${nbootcmd}


但是,由于我不想每次尝试都重新启动,所以我将其减少为:

 U-Boot 1.1.4 (Oct 27 2010 - 16:50:30) Marvell version: 3.4.4
Marvell>> setenv cmd printenv cmd\;printenv icmd\;version
Marvell>> setenv icmd \${cmd}
Marvell>> run cmd
cmd=printenv cmd;printenv icmd;version
icmd=${cmd}

U-Boot 1.1.4 (Oct 27 2010 - 16:50:30) Marvell version: 3.4.4
Marvell>> run icmd
## Error: "cmd;printenv" not defined
## Error: "icmd;version" not defined

现在我期望 run cmdrun icmd 表现相同。

现在我认为我可以通过以下方式达到相同的效果:

Marvell>> setenv icmd run cmd
Marvell>> run icmd
cmd=printenv cmd;printenv icmd;version
icmd=run cmd

U-Boot 1.1.4 (Oct 27 2010 - 16:50:30) Marvell version: 3.4.4

但我不明白为什么第一种形式不起作用。我要求了解我对 uBoot 的误解,而不是寻找有效的 hack?

u-boot qnap
1个回答
0
投票

U-Boot 中的递归变量被处理为简单的字符串替换,其方式类似于使用 C 预处理器的 #define 宏。不涉及 shell,也没有任何执行分层。字符串替换具有优先权,并且(递归变量的)替换在执行命令(对该递归变量进行操作)之前执行。

所以

run icmd
(在你的第一个版本中)将首先执行递归变量的扩展

run ${cmd}

然后尝试执行

run printenv cmd;printenv icmd;version

这是无效的。
run命令的操作数应该是一个环境变量,而不是另一个命令。 printenv 是一个 U-Boot 命令,而不是一个变量。

类似地,

printenv icmd
是一个带有有效操作数的命令,该操作数是变量,而
printenv ${cmd}
则不是(字符串替换后)。

© www.soinside.com 2019 - 2024. All rights reserved.