在“升级”到Mavericks和Xcode 5后,我遇到了各种小问题,以便让Xcode编译我的一些旧项目。
似乎Xcode正在向ld
链接器传递一个新参数,并且实际上并没有阻止Xcode这样做。由于各种原因我需要的ld
的旧版本在看到它不知道的参数时会出错(因此我的项目无法编译)。
我需要的是在我的旧版ld
上使用瘦包装来删除某些情况下的“错误”参数。我认为bash shell脚本是完美的,但bash不是我的强项。
这就是我所拥有的:
# Look for conditions necessary to use older ld
... # (placeholder, obviously)
# Run older ld (pseudo condition)
if [ <old_ld_condition> ]; then
ARGS=''
for var in "$@"; do
# Ignore known bad arguments
if [ "$var" = '-dependency_info' ]; then
continue
fi
ARGS="$ARGS $var"
done
/path/to/old/ld "$ARGS"
else
/path/to/new/ld "$@"
fi
但是,运行/path/to/old/ld "$ARGS"
会导致ld
将整个$ARGS
字符串解释为一个参数。运行/path/to/old/ld $ARGS
会导致ld
接收以前转义的字符串的非转义版本。
显然,我误解了$@
的性质,如何操纵它,以及如何将操作传递给较旧的ld
。谢谢大家。
答案 0 :(得分:11)
这应该有效:
# Run older ld (pseudo condition)
if [ <old_ld_condition> ]; then
ARGS=()
for var in "$@"; do
# Ignore known bad arguments
[ "$var" != '-dependency_info' ] && ARGS+=("$var")
done
/path/to/old/ld "${ARGS[@]}"
else
/path/to/new/ld "$@"
fi
答案 1 :(得分:4)
如果真的希望继续使用bash,你应该使用Bash Arrays:
declare -a ARGS
for var in "$@"; do
# Ignore known bad arguments
if [ "$var" = '-dependency_info' ]; then
continue
fi
ARGS[${#ARGS[@]}]="$var"
done
现在"${ARGS[@]}"
可以像"$@"
一样使用。 man bash
了解更多信息。