Создать многокомандный execute_process - PullRequest
1 голос
/ 17 октября 2019

Согласно документации execute_process может принимать более одной команды, и AFAIR они будут выполняться параллельно, поэтому запуск нескольких execute_process менее желателен. Каждая команда должна быть создана во время выполнения путем перебора списка. Проблема в том, что execute_process не может принять строку, содержащую токен COMMAND и команду с аргументами, подобными приведенным ниже, и execute_process не поддерживает команду сцепления с помощью &&:

set(commands)
foreach (Node ${NodeList})
    string(REGEX MATCHALL "[A-Za-z0-9_\\.]+" NodeDefinition "${Node}")
    list(GET NodeDefinition 1 IP)
    list(APPEND commands "COMMAND ssh -tt user@${IP} \"${command}\"")
endforeach ()
list(JOIN commands "\n" exec_commands)
message(STATUS "Commands: ${exec_commands}")
execute_process(${commands})

.

execute_process с неизвестным аргументом "COMMAND ssh -tt user@127.0.0.1" ls / bin ""

Есть ли способ обойти проблему?

EDIT001: похоже, что execute_process будет работать, если я сделаю это следующим образом:

execute_process(COMMAND ${command1}
                COMMAND ${command2}
                ...
                COMMAND ${commandn}
                )

Похоже, macro решит эту проблему

EDIT002: Ну, это не так

EDIT003: Согласно комментарию @ Цыварева, мне не нужно создавать строковые команды, просто добавьте все в список, а также пропустите двойные кавычки команды. Рабочий код выглядит как

foreach (Node ${NodeList})
    string(REGEX MATCHALL "[A-Za-z0-9_\\.]+" NodeDefinition "${Node}")

    list(GET NodeDefinition 0 Name)
    list(GET NodeDefinition 1 IP)
    string(SUBSTRING ${Name} 0 8 starts_with)

    if (starts_with STREQUAL "ch_node_")
        list(APPEND commands COMMAND ssh -tt user@${IP} ${command})
    endif ()
endforeach ()
execute_process(${commands})

1 Ответ

2 голосов
/ 17 октября 2019

При передаче нескольких команд на execute_process эти команды разделяются только ключевым словом COMMAND , нет , необходимо "группировать"команды с двойными кавычками .

После execute_process будут выполнены 3 команды:

execute_process(COMMAND echo abc
                COMMAND mkdir foo
                COMMAND ssh -tt user@127.0.0.1 ls /bin)

Таким образом, при формировании команд в переменной двойные кавычки также не нужны:

# Incorrect
list(APPEND commands "COMMAND ssh -tt user@${IP} \"${command}\"")
# Correct
list(APPEND commands COMMAND ssh -tt user@${IP} ${command})

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


Обратите внимание, что команды в execute_process не выполняются строго по порядку, а передаются по конвейеру: выходные данные первого COMMAND передаются во второй, выходные данные второго передаются в третийодин и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...