Cmake 创建多命令执行进程

Cmake 创建多命令执行进程,cmake,Cmake,根据文档execute\u process可以接受多个命令,并且它们将并行执行,因此运行多个execute\u process是不可取的。每个命令都应该在运行时通过遍历列表来创建。问题是execute\u进程无法接受包含命令标记的字符串,并且具有如下参数的命令和execute\u进程不支持使用和&链接命令: set(commands) foreach (Node ${NodeList}) string(REGEX MATCHALL "[A-Za-z0-9_\\.]+" NodeDefin

根据文档
execute\u process
可以接受多个命令,并且它们将并行执行,因此运行多个
execute\u process
是不可取的。每个命令都应该在运行时通过遍历列表来创建。问题是
execute\u进程
无法接受包含
命令
标记的字符串,并且具有如下参数的命令和
execute\u进程
不支持使用
和&
链接命令:

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})
它给

给定未知参数“ssh-tt命令”执行\u进程user@127.0.0.1“ls/bin”

有办法解决这个问题吗

EDIT001:如果我这样做,
execute\u进程
似乎可以工作:

execute_process(COMMAND ${command1}
                COMMAND ${command2}
                ...
                COMMAND ${commandn}
                )
看起来
将解决此问题

EDIT002:嗯,没有

EDIT003:根据@Tsyvarev comment,我不必创建stringy命令,只需将所有内容附加到列表中,以及跳过对命令的双引号。工作代码看起来像

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})

将多个命令传递给
execute\u process
时,这些命令被
COMMAND
关键字单独分开,因此无需使用双引号将命令“分组”

以下
execute\u过程将运行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\u process
中的命令不是严格按顺序执行的,而是通过管道执行的:第一个
命令的输出通过管道传输到第二个命令,第二个命令的输出通过管道传输到第三个命令,依此类推。

如果要传递列表,请不要将其括在双引号中(在
list(APPEND commands))
)。请看这个问题:。我想这不是我需要的。我需要每个命令作为列表中的一个条目,如果我不把它用双引号引起来,我将把每个标记作为列表中的一个条目。我将更新问题以澄清我仍然不理解的问题。。。您已经包含了
执行过程的milti命令签名
;注意:
命令
关键字周围没有双引号。这就是我在前面的评论中的意思:您不需要在
命令
及其后续参数周围添加双引号。但是您可能仍然引用了
${command}
参数user@127.0.0.1“ls/bin”)
将在目标计算机上运行
ls/bin
。注意,此行根本不使用变量。但是,如果这个命令实现了您最终想要实现的目标,那么
execute\u process
就不再是您的问题:您需要的是用所需的内容填充
commands
变量。。。你的意思是我必须在每个
命令的前后加上双引号吗?与此列表类似(追加命令“\”命令ssh-tt user@${IP}\“${COMMAND}\\”)