openwrt编译时automake.tmp错误_

本文介绍了在使用OpenWrt进行编译时遇到的Automake错误,主要由于新版本Perl对某些语法不支持。解决方案是应用补丁并更新Perl正则表达式,以确保与Perl 5.26.1兼容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

openwrt 编译时出现automake错误

Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/\${ <-- HERE ([^ \t=:+{}]+)}/ at ./bin/automake.tmp line 3938.
Makefile:50: recipe for target '/openwrt-master/build_dir/host/automake-1.15/.configured' failed
make[3]: *** [openwrt-master/build_dir/host/automake-1.15/.configured] Error 255
make[3]: Leaving directory '/openwrt-master/tools/automake'
tools/Makefile:134: recipe for target 'tools/automake/compile' failed
make[2]: *** [tools/automake/compile] Error 2
make[2]: Leaving directory '/openwrt-master'tools/Makefile:133: recipe for target '/openwrt-master/staging_dir/target-x86_64_musl1.1.14/stamp/.tools_install_yynyynynynyyyyyyynyyynyyyyyyyyynyyyyynyyynynnyyynnnyy' failed
make[1]: *** [/openwrt-master/staging_dir/target-x86_64_musl1.1.14/stamp/.tools_install_yynyynynynyyyyyyynyyynyyyyyyyyynyyyyynyyynynnyyynnnyy] Error 2
make[1]: Leaving directory '/openwrt-master'/openwrt-master/include/toplevel.mk:192: recipe for target 'world' failed
make: *** [world] Error 2

原因

查看perl版本
This is perl 5, version 26, subversion 1 (v5.26.1) built for x86_64-linux-gnu-thread-multi

1、新版本perl对一些写法不支持,需要增加一个插件

解决办法

vi tools/automake/patchs/210_automake_perl_5.26.1_ver.patch

增加程序如下:

diff --git a/bin/automake.in b/bin/automake.in
index a3a0aa318..2c8f31e14 100644
--- a/bin/automake.in
+++ b/bin/automake.in
@@ -3878,7 +3878,7 @@ sub substitute_ac_subst_variables_worker
 sub substitute_ac_subst_variables
 {
   my ($text) = @_;
-  $text =~ s/\${([^ \t=:+{}]+)}/substitute_ac_subst_variables_worker ($1)/ge;
+  $text =~ s/\$[{]([^ \t=:+{}]+)}/substitute_ac_subst_variables_worker ($1)/ge;
   return $text;
 }

保存退出

make V=99
<think>好的,用户之前问过关于存储命令结果到数组并遍历处理的问题,现在他提供了一个脚本示例,执行时遇到了错误,想要了解问题出在哪里以及如何解决。我需要仔细分析他的脚本,找出错误原因,并给出正确的解决方案。 首先,用户使用的是#!/bin/sh,这可能不是Bash,而是更简单的shell,比如dash。而数组操作在Bash中更可靠,尤其是在处理带空格的元素时。用户将uci命令的结果赋值给变量xujun,然后输出到文件,接着尝试用while循环读取。但执行时报错“line 5: wan_apn_internet: not found”,并且/tmp/01_test里的内容是“wan_apn_internet wan_apn_ota”,说明变量xujun被当作字符串处理,而不是数组。 问题可能出在几个地方。首先,使用$()命令替换时,如果没有用数组存储,变量xujun会变成一个由空格分隔的字符串。当尝试用$xujun | while read时,shell会尝试将xujun的内容作为命令执行,导致错误,因为第一个单词被当作命令,但不存在。例如,wan_apn_internet不是一个可执行命令,所以报错。 其次,用户可能没有使用Bash的特性,比如mapfile或者正确的数组赋值方式。在sh环境下,数组的支持有限,尤其是在处理多元素时,可能导致变量被展开为字符串,而不是数组元素。 解决方案应该是明确使用Bash,将结果存储为数组,并正确遍历数组元素。比如,使用mapfile或者循环读取来构建数组,然后在遍历时用双引号和数组下标来引用每个元素。此外,需要处理可能的空格或特殊字符,确保每个元素被正确分割。 还需要考虑输出到文件的内容是否正确,以及循环中的处理是否按预期工作。用户的当前脚本将变量直接输出到文件,导致元素被空格连接,而读取时可能没有正确分割。应该使用printf或者循环来逐行写入,确保每个元素独立一行,这样在读取时可以逐行处理。 最后,需要检查脚本的执行环境,确认是否真的使用Bash,并确保语法兼容。可能用户误用了sh而不是bash,导致数组处理失败。建议在shebang行使用#!/bin/bash,并调整数组操作方法,确保兼容性和正确性。</think>--- ### **问题诊断与分析** 您提供的脚本在执行时出现错误 `wan_apn_internet: not found`,核心问题在于 **变量存储与解析方式不匹配**。以下是详细分析: #### **关键错误点** 1. **变量赋值方式错误** `xujun=$(uci show network ...)` 会将命令输出的 **所有结果合并为一个字符串**,例如 `wan_apn_internet wan_apn_ota`。 当直接通过 `$xujun` 调用时,Shell 会尝试将其内容解析为命令(而非数据),导致第一个单词 `wan_apn_internet` 被当作命令执行,引发报错。 2. **管道输入逻辑错误** `$xujun | while read ...` 的意图是将变量内容逐行传递给循环,但实际语法应为: ```bash echo "$xujun" | while read ... # 需显式输出变量内容 ``` 3. **Shell 兼容性问题** 使用 `#!/bin/sh`(通常是轻量级 Shell,如 `dash`)可能导致某些 Bash 特性(如数组)不可用。 --- ### **修正方案与完整代码** #### **方案1:兼容性写法(POSIX Shell)** ```bash #!/bin/sh # 将结果逐行写入临时文件,确保正确处理空格/特殊字符 uci show network | grep "proto='cellularmanager'" | awk -F '.' '{print $2}' > /tmp/01_test.tmp # 从文件逐行读取处理 echo "匹配到的配置段:" cat /tmp/01_test.tmp | while read section; do echo "network.$section" done # 清理临时文件 rm -f /tmp/01_test.tmp ``` #### **方案2:Bash 增强版(推荐)** ```bash #!/bin/bash # 将结果存入数组(需确保使用 Bash) mapfile -t sections < <(uci show network | grep "proto='cellularmanager'" | awk -F '.' '{print $2}') # 检查数组是否为空 if [ ${#sections[@]} -eq 0 ]; then echo "未找到匹配的配置段" exit 0 fi # 遍历输出 echo "匹配到的配置段:" for section in "${sections[@]}"; do echo "network.$section" done # 可选:保存到文件 printf "%s\n" "${sections[@]}" > /tmp/01_test ``` --- ### **关键改进说明** | 原脚本问题 | 修正方法 | 作用 | |--------------------------|-------------------------------|----------------------------------| | 变量直接存储多行内容 | 使用临时文件或数组 | 避免字符串解析歧义 | | `$xujun` 直接调用 | 通过 `echo` 或数组遍历 | 确保内容作为数据处理(非命令) | | 缺乏错误检查 | 添加空数组判断 | 防止无效操作 | | 输出格式混乱 | 使用 `printf "%s\n"` | 确保每行独立存储 | --- ### **执行验证** 1. **修正后脚本输出**: ```bash 匹配到的配置段: network.wan_apn_internet network.wan_apn_ota ``` 2. **文件 `/tmp/01_test` 内容**: ```text wan_apn_internet wan_apn_ota ``` --- ### **扩展建议** 1. **统一使用 Bash** 在脚本首行明确使用 `#!/bin/bash`,避免因 Shell 差异导致兼容性问题。 2. **敏感操作保护** 若需实际删除配置段,可添加交互确认: ```bash read -p "确认删除以上配置?(y/N) " -n 1 -r [[ $REPLY =~ ^[Yy]$ ]] && uci delete "network.$section" ``` 3. **日志记录** 添加操作审计日志: ```bash echo "$(date): 已处理 network.$section" >> /var/log/config_clean.log ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值