我正在尝试解析10.6中Xcode 3.2中的HEADER_SEARCH_PATHS环境变量。这是一串路径,如:
"~/My Path with Spaces" /usr/local /myrootpath
我需要按照所有shell的引用规则拆分这个字符串,这样我就可以遍历参数列表并预先添加-I然后将所有这些传递给gcc,如下所示:
gcc -I"~/Path with Spaces" -I/usr/local -I/myrootpath
我研究过awk,sed,set,$ @,一切。我认为这会奏效:
set -- $HEADER_SEARCH_PATHS
for arg in $@
do
echo "arg $i:$arg:" >> mytestfile.txt
let "i+=1"
done
但它只在空间上分裂,结果是:
arg :"~/Path:
arg 1:with:
arg 2:Spaces":
arg 3:/usr/local:
arg 4:/myrootpath:
如果有一个gcc工具可以在一个步骤中设置包含路径,我也很好奇。我必须遗漏一些基本的东西。感谢名单!
答案 0 :(得分:0)
#!/bin/bash
OTHER_LINKER_FLAGS="-L/usr/lib -lfoo"
GCC_PREFIX_HEADER="blah"
HEADER_SEARCH_PATHS="\"/path with spaces\" /usr/include /home/user/includes"
eval set -- $HEADER_SEARCH_PATHS
for arg in "$@"; do
INCLUDE_STRING+="-I$arg "
done
g++ ${INCLUDE_STRING} ${OTHER_LINKER_FLAGS} -c ${GCC_PREFIX_HEADER}
答案 1 :(得分:0)
不漂亮,但perl无处不在......
$ cat prep.pl
#!/usr/bin/perl
while ($#ARGV>=0) {
print " -I\"";
print shift;
print "\"";
}
$ echo $A
"a b c" x y
$ perl -e '$cmd="./prep.pl ".$ENV{"A"}; $args= `$cmd`; print("gcc ".$args);'
gcc -I"a b c" -I"x" -I"y"
如果用系统替换最后一个打印件,那么我认为你会得到你想要的东西(假设你为gcc添加一些东西以实际压缩)。
e.g。
$ perl -e '$cmd="./prep.pl ".$ENV{"A"}; $args= `$cmd`; system("gcc ".$args." 1.c");'
可能不是理想的解决方案,但嘿,已经很晚了。
答案 2 :(得分:0)
thanx为你快速反应的人! 在睡觉之后,我使用eval和shift来解决问题。 诀窍是,如果你访问$ 1它可以工作,但如果你循环$ *或$ @它失败。 如果有人知道为什么$ 1转换方法有效,解释可能会帮助其他人。 然后我将前置的字符串附加到带有printf的最终字符串。
#this script will create a prefix.h.gch precompiled
#header in the project's directory.
cd "${PROJECT_DIR}"
eval set -- $HEADER_SEARCH_PATHS
HEADER_SEARCH_STRING=""
while [ $# -gt 0 ]; do
HEADER_SEARCH_STRING=HEADER_SEARCH_STRING printf %s "-I\"$1\" "
shift
done
g++ ${HEADER_SEARCH_STRING} ${OTHER_LINKER_FLAGS} -c ${GCC_PREFIX_HEADER}
#this是使用函数执行相同操作的另一个示例:
TESTVAR="\"hello there\" a b /my/path"
TOKENS=""
function tokenize {
while [ $# -gt 0 ]; do
TOKENS=TOKENS printf %s "-I\"$1\" "
#TOKENS=TOKENS echo "-I\""$1"\""
#echo "$1"
shift
done
}
eval tokenize $TESTVAR
echo $TOKENS