如何在bash中拦截并删除命令行参数

13

升级到Mavericks和Xcode 5后,我需要处理一些小问题,以便使Xcode编译我的旧项目。

似乎Xcode正在向ld链接器传递一个新参数,而实际上无法阻止Xcode这样做。我需要的是一个薄包装层来覆盖我的旧版本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 存在一些误解。感谢大家。


你可以在Xcode中选择命令行工具集的版本,我不知道这是否会对你有所帮助?通常情况下,除非你进行了完全的新安装,否则旧的SDK和命令行工具集版本将共存。 - Andon M. Coleman
这些项目是实际的 Xcode .xcodeproj 文件,不幸的是,我没有能力将它们转移到命令行构建过程(例如 make)。不过还是感谢您的建议。 - inspector-g
2个回答

19
这应该可以工作:
# 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

5

如果你真的想使用bash,那么你应该使用Bash数组:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接