Разобрать строку в список аргументов, как если бы она была напечатана в консоли? - PullRequest
0 голосов
/ 11 декабря 2010

Я пытаюсь проанализировать переменную окружения HEADER_SEARCH_PATHS в Xcode 3.2 в 10.6.Это строка путей, например:

"~/My Path with Spaces" /usr/local /myrootpath

Мне нужно разделить эту строку, следуя всем правилам цитирования оболочки, чтобы я мог перебрать список аргументов и предварять -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, который устанавливаетвключить путь в один шаг.Я, должно быть, упускаю что-то простое.Thanx!

Ответы [ 3 ]

0 голосов
/ 11 декабря 2010

Не красиво, но 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 для фактической компиляции).

, например

$ perl -e '$cmd="./prep.pl ".$ENV{"A"}; $args= `$cmd`; system("gcc ".$args." 1.c");'

Возможно, не идеальное решение, но эй, уже поздно.

0 голосов
/ 11 декабря 2010

Спасибо за ваши быстрые ответы, ребята! поспав на нем, я пришел к решению, используя eval и shift. хитрость в том, что если вы получаете доступ к $ 1, это работает, но если вы зацикливаетесь на $ * или $ @, это не работает. если кто-то знает, почему работает метод $ 1 shift, объяснение может помочь другим. затем я добавляю предварительно добавленные строки к конечной строке с помощью 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}


# это альтернативный пример того же действия с функцией:

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
0 голосов
/ 11 декабря 2010
#!/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}
...