簡體   English   中英

如何在bash中攔截和刪除命令行參數

[英]How to intercept and remove a command line argument in bash

在“升級”到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 in "$@"; do
        # Ignore known bad arguments
        [ "$var" != '-dependency_info' ] && ARGS+=("$var")
    done

    /path/to/old/ld "${ARGS[@]}"
else
    /path/to/new/ld "$@"
fi

如果你真的想繼續使用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獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM