You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下CMake通过Bash执行Shell脚本无法获取退出码

CMake配置阶段执行Bash脚本无法获取正确退出码

问题重现

在CMake配置阶段调用Bash脚本时,脚本明确返回退出码1,但CMake始终返回结果0,无法识别执行失败,COMMAND_ERROR_IS_FATAL也未触发。

CMake代码

find_program(BASH_EXECUTABLE bash
    NAMES bash git-bash
    HINTS
        "C:/Program Files/Git/bin"
    REQUIRED
)

execute_process (
    COMMAND ${BASH_EXECUTABLE} "exit1.sh"
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    COMMAND_ERROR_IS_FATAL ANY
    OUTPUT_VARIABLE RESULTSV_OUT
    ERROR_VARIABLE RESULTSV_ERR
    ECHO_OUTPUT_VARIABLE
    ECHO_ERROR_VARIABLE
    RESULT_VARIABLE RESULTSV_VARY
)
message("MESSAGE OUTPUT IS ${RESULTSV_OUT}" )
message("MESSAGE ERROR IS ${RESULTSV_ERR}" )
message("MESSAGE RESULTS IS ${RESULTSV_VARY}" )

执行结果

1> [CMake] MESSAGE OUTPUT IS 
1> [CMake] MESSAGE ERROR IS 
1> [CMake] MESSAGE RESULTS IS 0

被执行的exit1.sh脚本内容

#!/usr/bin/bash
exit 1

已确认脚本确实运行,但CMake无法捕获Bash的退出码。

解决方案

1. 确保脚本路径传递正确

使用绝对路径调用脚本,避免路径解析异常:

execute_process (
    COMMAND ${BASH_EXECUTABLE} "${CMAKE_SOURCE_DIR}/exit1.sh"
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    COMMAND_ERROR_IS_FATAL ANY
    OUTPUT_VARIABLE RESULTSV_OUT
    ERROR_VARIABLE RESULTSV_ERR
    ECHO_OUTPUT_VARIABLE
    ECHO_ERROR_VARIABLE
    RESULT_VARIABLE RESULTSV_VARY
)

2. 使用bash -c执行脚本

通过-c参数让Bash直接执行命令,确保退出码正确传递:

execute_process (
    COMMAND ${BASH_EXECUTABLE} -c "./exit1.sh"
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    COMMAND_ERROR_IS_FATAL ANY
    OUTPUT_VARIABLE RESULTSV_OUT
    ERROR_VARIABLE RESULTSV_ERR
    ECHO_OUTPUT_VARIABLE
    ECHO_ERROR_VARIABLE
    RESULT_VARIABLE RESULTSV_VARY
)

3. 修复脚本换行符问题

若脚本使用Windows风格的CRLF换行符,Bash可能无法正确解析shebang导致执行异常,需将脚本换行符改为LF格式。

4. 给脚本添加执行权限(Git Bash环境)

在Git Bash中执行以下命令赋予脚本执行权限:

chmod +x ${CMAKE_SOURCE_DIR}/exit1.sh

内容的提问来源于stack exchange,提问作者Klypto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:14:56