在bin/sh/bash中使用$*调用clang后如何保留单引号参数?
解决Shell包装器中Clang参数传递的引号保留问题
问题根源在于脚本中使用$*传递参数时,Shell会将所有参数拼接成单一字符串后按空格拆分,导致带引号的参数(如-DPACKAGE_VERSION="2.2.0-pre")失去引号的边界保护,被拆分为-DPACKAGE_VERSION=和"2.2.0-pre"两个独立参数,Clang因此将后者误判为不存在的文件路径。
以下是修正后的脚本:
#!/bin/sh CLANG=${CLANG:-clang} # 检查参数中是否包含"keyword",避免参数拆分错误 if printf "%s\n" "$@" | grep -q "keyword"; then exec "$CLANG" "$@" else exec "$CLANG" "$@" -fsanitize=hextype fi
关键修改说明:
- 用
"$@"替代$*:"$@"会严格保留每个原始参数的边界,即使参数包含空格或引号,也能完整传递给Clang。 - 优化参数检查逻辑:原
echo $* | grep会破坏参数结构,改用printf "%s\n" "$@"逐个输出参数,配合grep -q判断关键词存在性,避免参数拆分问题。 - 给
$CLANG添加双引号:防止CLANG变量包含特殊字符或空格时出现执行错误。
内容的提问来源于stack exchange,提问作者Crystal
相关产品推荐
相关产品推荐

