根据文档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})
答案 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()
的输出通过管道传递到第二个,第二个的输出通过管道传递到第三个,等等。