【问题标题】:How to intercept and remove a command line argument in bash如何在 bash 中拦截和删除命令行参数
【发布时间】:2014-02-27 19:21:23
【问题描述】:

“升级”到 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 有一些误解。谢谢大家。

【问题讨论】:

  • 你可以在Xcode中选择命令行工具集版本,不知道对你有没有帮助?通常,除非您进行了全新安装,否则旧的 SDK 和命令行工具集版本将共存。
  • 这些项目是实际的 Xcode .xcodeproj 文件,不幸的是我无法将它们带到命令行构建过程(例如 make)。不过感谢您的建议。

标签: bash shell arguments command-line-arguments


【解决方案1】:

这应该可行:

# 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

【讨论】:

    【解决方案2】:

    如果你真的想要继续使用 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 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      相关资源
      最近更新 更多