首页 > 解决方案 > 创建多命令execute_process

问题描述

根据文档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"”

有没有办法解决这个问题?

execute_processEDIT001:如果我这样做,看起来会起作用:

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

看起来macro会解决这个问题

EDIT002:嗯,它没有

EDIT003:根据@Tsyvarev 评论,我不必创建字符串命令,只需将所有附加到列表中,也可以跳过双引号命令。工作代码看起来像

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

标签: cmake

解决方案


传递多个命令时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一个的输出通过管道传输到第二个,第二个的输出通过管道传输到第三个,依此类推。


推荐阅读