[英]bash: How to intercept command line and do various actions based on the contents?
[英]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.