bash - 如何拦截和删除 bash 中的命令行参数

标签 bash shell arguments command-line-arguments

在“升级”到 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/

相关文章:

php - 使用 apache 通过 php 执行 shell 脚本时,当前用户和 env 用户不匹配

linux - 用参数替换 bash 脚本中的部分命令

python - 传递带有非字符串关键字的字典以在 kwargs 中运行

linux - 在 linux 中使用 TFS 同步文件夹

linux - 在 bash 中依次运行多个脚本

bash - 如何在 gawk 中将日期字符串转换为时间戳?

bash - 如何确保我的 bash 脚本尚未运行?

shell - 按层次结构创建 shell 子命令

bash - Shell脚本对编码和行尾是否敏感?

linux - 为什么我的 mac 终端的 ps -u 不工作?