cmake - 创建多命令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_process
EDIT001:如果我这样做,看起来会起作用:
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})
解决方案
传递多个命令时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
一个的输出通过管道传输到第二个,第二个的输出通过管道传输到第三个,依此类推。
推荐阅读
- performance - Powershell Start-Job 和 Start-ThreadJob 性能
- python - 你如何在python中编写一个自我更新的类变量
- python - 如果我在单行上使用 f-string,如何添加数据类型?
- php - Angular:每当我试图指向带有ibn的文件夹时“清理不安全的URL值”
- java - 我应该抛出什么异常来返回与使用@Valid 时得到的相同的错误请求响应?
- bar-chart - altair - 将刻度线与条形图中的条形中心对齐
- mongodb - 在mongodb中使用limit时如何获取匹配文档的真实数量?
- android - 如何使用屏幕尺寸缩放materialalertdialog?
- ios - 为什么 CALayer 蒙版没有居中并偏离几个像素?
- javascript - 如何使用 tspan 对文本使用退出选择