问题现象
在全志 V853 平台源码环境下,执行source build/envsetup.sh后运行lunch,项目列表完全不显示,无法选择编译目标,直接影响编译流程启动。
排查环境
- 系统:Ubuntu 22.04
- 源码:全志 V853 melis 源码
- 问题命令:
lunch
排查步骤
1. 基础目录与文件检查
首先确认target目录存在且权限正常:
ls -ld target
# 输出:drwxr-xr-x 7 geoffrey geoffrey 4096 Aug 6 2025 target
手动执行find查找vendorsetup.sh,能正常找到文件:
# 不带-L
find target -name vendorsetup.sh | head -5
# 带-L(与脚本一致)
find -L target -maxdepth 4 -name vendorsetup.sh | head -5
结果均能输出target/allwinner/xxx/vendorsetup.sh,说明文件存在、find 命令本身无问题。
2. 脚本逻辑定位
查看envsetup.sh中lunch菜单生成逻辑:
# 核心代码片段
awchips=$(ls $(pwd)/device/config/chips | awk '{print " -e "$1"-"}')
verdors=$(find -L target -name vendorsetup.sh | grep $awchips | sort)
awchips:生成 grep 匹配规则verdors:筛选有效项目路径- 日志显示
verdors=为空,说明grep 匹配失败。
3. 根因定位
排查发现:系统别名ls --color=auto导致输出带 ANSI 颜色转义码 ,这些不可见字符被带入awchips变量,grep 无法匹配纯文本路径,最终verdors为空,lunch无列表。
验证:
echo "$awchips" | cat -A
# 若出现^[[等转义字符,确认颜色码干扰
解决方案
修改build/envsetup.sh,禁用 ls 颜色输出、绕过系统别名。
1. 修复 awchips 生成行
将:
awchips="$(ls $(pwd)/device/config/chips | awk '{print " -e "$1"-"}')"
改为:
# 方法1:使用\ls绕过别名
awchips="$(\ls $(pwd)/device/config/chips | awk '{print " -e "$1"-"}')"
# 方法2:显式禁用颜色
awchips="$(ls --color=never $(pwd)/device/config/chips | awk '{print " -e "$1"-"}')"
2. 同步修复 PLATFORM_CHOICES 行
export PLATFORM_CHOICES="$(\ls $(gettop)/target/allwinner 2>/dev/null | grep common | sort | uniq | sed 's/-common//g')"
3. 生效验证
source build/envsetup.sh
lunch
此时lunch正常显示全志平台项目列表。
问题总结
- 根本原因 :shell 别名导致
ls输出颜色转义码,污染 grep 匹配规则。 - 关键现象:find 能找到文件,但 grep 无输出,verdors 变量为空。
- 通用经验 :shell 脚本中调用系统命令,建议用
\command或--color=never避免环境干扰。