2016-10-15 5 views
0

Я хотел бы иметь функцию, в которой я выполнить команду (например, make) и один аргумент этой функции может быть строка с кратному аргументы для этой команды ,Попутный несколько аргументов команды в один аргумент раскошелиться функции

Вот пример неисправного скрипт, который демонстрирует, что я хотел бы достичь:

#!/bin/sh 

set -e 
set -u 
set -v 
set -x 
buildSomething() { 
    make ${1} 
} 

buildSomething "CFLAGS=\"-DX=1 -DY=1\" CXXFLAGS=\"-DXX=11 -DYY=11\" -j$(nproc)" 

Это не удается, потому что оболочка решает привести аргументы снова:

buildSomething "CFLAGS=\"-DX=1 -DY=1\" CXXFLAGS=\"-DXX=11 -DYY=11\" -j$(nproc)" 
nproc 
++ nproc 
+ buildSomething 'CFLAGS="-DX=1 -DY=1" CXXFLAGS="-DXX=11 -DYY=11" -j8' 
+ make 'CFLAGS="-DX=1' '-DY=1"' 'CXXFLAGS="-DXX=11' '-DYY=11"' -j8 
make: invalid option -- 'D' 
make: invalid option -- 'Y' 
make: invalid option -- '=' 
make: invalid option -- '1' 
make: invalid option -- '"' 
make: invalid option -- 'D' 
make: invalid option -- 'Y' 
make: invalid option -- 'Y' 
make: invalid option -- '=' 
make: invalid option -- '1' 
make: invalid option -- '1' 
make: invalid option -- '"' 

Я знаю, что проблема с цитированием, но я думаю, что я пробовал все комбинации, о которых я мог думать ... Есть ли общее решение этой проблемы? Я не настаиваю на том, чтобы установить этот точный сценарий выше, другой подход, который позволил бы мне сделать то, о чем упоминалось в первом абзаце, также будет в порядке. Поскольку такая функция имеет несколько команд, каждая из них может иметь свои аргументы в другом аргументе функции, для меня действительно важно иметь несколько аргументов для каждой команды в один аргумент функции (или что-то подобное).

+2

Вы попробовали 'make '$ {1}" ... '? Затем просто вызывается как 'buildSomething 'CFLAGS = -DX = 1 -DY = 1 ...." '? Удачи. – shellter

+0

@shellter - этот пример действительно работал так, как предполагалось, с вашими изменениями, поэтому я обновил сообщение с более сложным сценарием - аргумент не может быть указан там, так как мне нужно передать ** несколько ** аргументов и процитировать их при вызове команды объединяет их все в один (неверный) аргумент. Я в настоящее время пытаюсь «eval make ...» - кажется хорошим решением, но, возможно, что-то лучше. –

+1

и вы знаете о '$ {@}' и '" $ {@} "'? .... 'eval' обычно считается злом, но в вашем случае это может быть ваш единственный вариант. Удачи. – shellter

ответ

1
#!/bin/sh 

buildSomething() { 
    eval "make ${1}" 
} 

buildSomething 'CFLAGS=\"-DX=1 -DY=1\" CXXFLAGS=\"-DXX=11 -DYY=11\"'" -j$(nproc)" 
Смежные вопросы