在“升级”到 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
有一些误解。谢谢大家。
最佳答案
这应该有效:
# Run older ld (pseudo condition)
if [[ <old_ld_condition> ]]; then
args=()
for var; do
# Ignore known bad arguments
[[ $var != '-dependency_info' ]] && args+=("$var")
done
/path/to/old/ld "${args[@]}"
else
/path/to/new/ld "$@"
fi
关于bash - 如何拦截和删除 bash 中的命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21542054/