创建多个命令execute_process

时间:2019-10-17 07:41:45

标签: cmake

根据文档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:根据@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})

1 个答案:

答案 0 :(得分:2)

将多个命令传递给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中的命令不是严格按顺序执行的,而是通过管道传递的:第一个QS = request.args.get('q') xVal,yVal = QS.split('.') x = xVal y = yVal*-1 path = 'debug.txt' dataRec = open(path, 'a') debugInfo = (str(QS) + ' xVal is ' + str(xVal) + ' yVal is ' + str(yVal) + ' Y is ' + str(y) + '\n') dataRec.write(str(debugInfo)) dataRec.close() 的输出通过管道传递到第二个,第二个的输出通过管道传递到第三个,等等。