Я хотел бы иметь функцию, в которой я выполнить команду (например, 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 -- '"'
Я знаю, что проблема с цитированием, но я думаю, что я пробовал все комбинации, о которых я мог думать ... Есть ли общее решение этой проблемы? Я не настаиваю на том, чтобы установить этот точный сценарий выше, другой подход, который позволил бы мне сделать то, о чем упоминалось в первом абзаце, также будет в порядке. Поскольку такая функция имеет несколько команд, каждая из них может иметь свои аргументы в другом аргументе функции, для меня действительно важно иметь несколько аргументов для каждой команды в один аргумент функции (или что-то подобное).
Вы попробовали 'make '$ {1}" ... '? Затем просто вызывается как 'buildSomething 'CFLAGS = -DX = 1 -DY = 1 ...." '? Удачи. – shellter
@shellter - этот пример действительно работал так, как предполагалось, с вашими изменениями, поэтому я обновил сообщение с более сложным сценарием - аргумент не может быть указан там, так как мне нужно передать ** несколько ** аргументов и процитировать их при вызове команды объединяет их все в один (неверный) аргумент. Я в настоящее время пытаюсь «eval make ...» - кажется хорошим решением, но, возможно, что-то лучше. –
и вы знаете о '$ {@}' и '" $ {@} "'? .... 'eval' обычно считается злом, но в вашем случае это может быть ваш единственный вариант. Удачи. – shellter