configure.ac无法获取SQLANY环境变量的问题及通用路径获取需求
问题原因及解决方案
问题根源
- 环境变量未导出:configure脚本以终端shell的子进程形式运行,只有通过
export标记的环境变量才会被子进程继承。你在终端用set能看到SQLANY相关变量,但这些变量大概率没被导出,因此configure的子shell无法获取到。 - 命令写法问题:原代码里的
grep \"SQLANY\[09\]\*\"存在两处问题:- 转义过度,在configure的shell环境中无需额外转义引号和方括号;
[09]仅能匹配字符0或9,无法覆盖任意版本号(比如17),应使用[0-9]+匹配一个或多个数字。
通用解决方案
步骤1:确保环境变量可被继承(可选,若变量未导出)
如果终端里的变量未导出,运行configure前先执行:
export SQLANY17 SQLANYSAMP17
也可将上述命令添加到~/.bashrc或~/.profile中,实现永久生效。
步骤2:修改configure.ac代码
用env命令替代set(env仅列出子进程可继承的导出环境变量),配合正则匹配任意版本号,简化命令写法:
# 获取第一个匹配到的SQLANY版本变量(如SQLANY17=/opt/sqlanywhere17) SQLANY=$(env | grep -E '^SQLANY[0-9]+=' | head -n1) AC_MSG_NOTICE([Variable is $SQLANY]) # 直接解析出安装路径(后续可用于配置) SQLANY_PATH=$(env | grep -E '^SQLANY[0-9]+=' | head -n1 | awk -F= '{print $2}') AC_MSG_NOTICE([SQL Anywhere installation path: $SQLANY_PATH])
代码说明
env | grep -E '^SQLANY[0-9]+=':匹配所有以SQLANY开头、后跟一个或多个数字、再跟等号的环境变量行;head -n1:取第一个匹配项(若存在多个版本,可根据需求调整,比如排序后取最新版本);awk -F= '{print $2}':以等号为分隔符,提取变量值即安装路径。
备选方案(无需依赖环境变量)
如果无法确保环境变量被导出,可直接扫描系统默认安装路径:
# 查找/opt下的sqlanywhere目录 SQLANY_PATH=$(find /opt -name "sqlanywhere[0-9]*" -type d | head -n1) if test -n "$SQLANY_PATH"; then AC_MSG_NOTICE([Found SQL Anywhere at: $SQLANY_PATH]) else AC_MSG_WARN([SQL Anywhere not found in /opt]) fi
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

