Скажем, есть программа, которая требует ввода в форме <prog> --param "one;two;three"
: флаг --param
, за которым следует строка (заключенная в кавычки) слов, разделенных точкой с запятой. Например, можно использовать следующий сценарий Bash:
flag=${1}
items=(${2//;/ })
echo "flag: ${flag}"
echo "items: ${items[@]}"
Очевидно, что результат будет:
flag: --param
items: one two three
Разделитель ;
является обязательным, и поэтому нам нужно чтобы передать строку, заключенную в кавычки, иначе shell будет рассматривать вещи между точками с запятой как отдельные команды.
Этот вопрос чем-то похож на этот , но предложенный ответ там не работает для
Рассмотрим этот CMakeLists.txt
файл:
cmake_minimum_required(VERSION 3.16.2)
project(clumsy)
add_custom_command(OUTPUT foo.txt
COMMAND bash ${CMAKE_SOURCE_DIR}/script.sh --param "one;two;three" &>> foo.txt
WORKING_DIRECTORY ${CMAKE_BUILD_DIR}
VERBATIM
)
add_custom_target(foo DEPENDS foo.txt)
set(PARAMS "one;two;three")
add_custom_command(OUTPUT bar.txt
COMMAND bash ${CMAKE_SOURCE_DIR}/script.sh --param "${PARAMS}" &>> bar.txt
WORKING_DIRECTORY ${CMAKE_BUILD_DIR}
VERBATIM
)
add_custom_target(bar DEPENDS bar.txt)
Запуск make foo
после настройки работает должным образом:
[100%] Generating foo.txt
flag: --param
items: one two three <----
[100%] Built target foo
Однако make bar
приводит к неправильный вывод, потому что переменная PARAMS
была развернута в виде списка, а фактический ввод был --param one two three
вместо --param "one;two;three"
:
[100%] Generating bar.txt
flag: --param
items: one <----
[100%] Built target bar
Как использовать переменную PARAMS
и при этом делать ввод для внешнего команда состоит из двух аргументов ?
ОБНОВЛЕНИЕ
Я сделал код CMakeLists.txt
более сложным с использованием перенаправлений вывода, включающих &
(например, * 1040) *) который конфликтует с использованием VERBATIM
fl ag, который важен для работы с переменными кавычками.