uci
文档说:
所有“
”、“uci set
”、“uci add
”和“uci rename
”命令都暂存到临时位置,并使用“uci delete
”立即写入闪存。uci commit
如果我做对了,您首先运行一些类似于上面提到的命令,并将更改写入您运行的配置文件中
uci commit
。例如,假设我做了以下更改...
root@OpenWrt:~# uci changes
network.vlan15.ifname='eth1.15'
network.vlan15.type='bridge'
network.vlan15.proto='static'
network.vlan15.netmask='255.255.255.0'
network.vlan15.ipaddr='192.168.10.0'
...但我不想继续并承诺它们。有没有一种简单的方法可以恢复所有分阶段的更改并避免逐一执行?
这应该可以通过以下命令实现:
root@firlefanz:~# rm -rf /tmp/.uci/
有一个命令可以恢复所有分阶段的更改
revert <config>[.<section>[.<option>]] Revert the given option, section or configuration file.
所以,就你而言,应该是
uci revert network.vlan15
这句话应该可以解决问题:
uci changes | sed -rn 's%^[+-]?([^=+-]*)([+-]?=.*|)$%\1%' | xargs -n 1 uci revert
tl;dr sed 命令从暂存的更改中提取选项名称。 xargs 命令对每个提取的选项执行恢复命令。
现在让我们深入了解一切:
uci changes
打印准备好的更改,然后将其通过管道传输到 sed 命令。
sed 选项
-r
启用扩展正则表达式并 -n
抑制模式匹配的自动打印。
sed 命令
s
用于执行搜索和替换,%
用作搜索和替换术语的分隔符。
uci 换乘线路有不同的格式。
删除的配置选项带有前缀
-
。
添加的配置选项带有前缀 +
更改的选项没有前缀。
为了匹配前缀
[+-]?
使用。问号表示方括号中的字符之一可以是可选匹配的。
选项名称将与模式
[^=+-]*
匹配。该正则表达式具有任意数量的字符的含义,只要该字符不是 =+-
之一。
它位于圆括号内,将其标记为组以便稍后重复使用。
下一个模式([+-]?=.*|)也是一个模式组。管道中吐出两个不同的组。 第二部分很简单,根本没有任何性格。当删除 uci 选项时会发生这种情况。 第一部分意味着字符
=
可以选择在前面加上 +
或 -
。 =
之后可以是一个或多个字符,用.*
表示。 =<value>
发生在添加的配置上。前置 -
或 +
表示该值已从列表中删除或添加到列表(如果选项是列表)。
在替换模式中,整行被其引用
\1
替换为第一组。换句话说:仅打印选项名称。
所有选项名称都会发送到 xargs。使用选项
-n 1
xargs 对 sed 发送的每个 uci revert <option_name>
执行 option_name
。
这是
uci changes
输出的不同格式的一些示例:
-a
+b='create new option with this value'
c='change an existing option to this value'
d+='appended to list'
e-='removed from list'
提取的选项名称如下:
a
b
c
d
e
xargs -n 1
然后将执行以下命令:
uci revert a
uci revert b
uci revert c
uci revert d
uci revert e
这就是一句台词的全部魔力。
我没有找到
uci
命令来恢复所有未提交的更改,但您可能可以使用一些 shell 脚本来解析 uci changes
命令的输出,以实现所需的结果。这是一个示例脚本:
#!/bin/ash
# uci-revert-all.sh
# Revert all uncommitted uci changes
# Iterate over changed settings
# Each line has the form of an equation, e.g. parameter=value
for setting in $(uci changes); do
# Extract parameter from equation
parameter=$(echo ${setting} | grep -o '^\(\w\|[._-]\)\+')
# Display a status message
echo "Reverting: ${parameter}"
# Revert the setting for the given parameter
uci revert "${parameter}"
done
更简单的替代方法可能是使用
uci revert <config>
语法,例如:
#!/bin/ash
# uci-revert-all.sh
# Revert all uncommitted uci changes
for config in /etc/config/*; do
uci revert $(basename ${config})
done
这两种方法在运行 LEDE 4 的路由器上都很适合我。
这是另一个简短的行话来恢复所有未分阶段的更改(根据问题):
for i in /etc/config/* ; do uci revert ${i##*/} ; done
请注意,这将恢复每个配置文件的所有更改。
@BMC 提出了一项改进:仅恢复自上次启动以来修改过的文件的更改:
for i in /tmp/.uci/* ; do uci revert ${i##*/} ; done
(仅供参考,这使用 posix 参数扩展 的“删除最大前缀模式”。)