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

CMake执行后异常切换当前目录?求解决该问题的技巧

解决CMake执行后工作目录不可控的问题

你的脚本中cmake ~/codebase/命令存在工作目录不稳定的问题:CMake在重新生成构建文件时可能意外改变当前shell的工作路径,无变更时则保持原目录,导致后续命令的执行路径不可控。以下是几种可靠的解决技巧:

方法1:显式指定CMake构建目录(推荐)

CMake 3.13+版本支持-S(源码目录)和-B(构建目录)参数,这种调用方式完全脱离当前工作目录的依赖,且不会改变shell的工作路径,彻底避免目录混乱:

# 替换原cmake和make命令
cmake -S ~/codebase/ -B ~/codebase/build
make -C ~/codebase/build

通过-B明确指定构建输出目录,make -C指定编译目录,无论脚本当前处于哪个路径,所有构建操作都会严格在~/codebase/build下执行。

方法2:强制切换回构建目录

如果你的CMake版本不支持-S/-B参数,可以在cmake执行后强制切换回build目录,确保后续命令始终在正确路径下运行:

cd ~/codebase/build
rm bin/*
rm -R runs
cmake ~/codebase/
# 强制回到build目录,不受cmake执行结果影响
cd ~/codebase/build
make
mkdir runs
# ... 后续循环逻辑

这种方式简单直接,确保后续所有操作都在目标目录内完成。

方法3:全路径替代相对路径

把脚本中所有相对路径替换为绝对路径,彻底摆脱对当前工作目录的依赖:

#!/bin/bash
BUILD_DIR=~/codebase/build

cd "$BUILD_DIR"
rm -f "$BUILD_DIR"/bin/*
rm -Rf "$BUILD_DIR"/runs

cmake ~/codebase/
make -C "$BUILD_DIR"

mkdir "$BUILD_DIR"/runs
for i in "$BUILD_DIR"/bin/*
do
    # 先清理旧的results目录,避免重复创建报错
    rm -Rf "$BUILD_DIR"/results
    mkdir "$BUILD_DIR"/results
    mkdir "$BUILD_DIR"/results/indexes
    mkdir "$BUILD_DIR"/results/workloads
    
    echo "Executing $i"
    "$i" >"$BUILD_DIR"/checksum.txt
    mv "$BUILD_DIR"/checksum.txt "$BUILD_DIR"/runs/$(basename "$i")_checksum.txt
    mv "$BUILD_DIR"/results "$BUILD_DIR"/runs/$(basename "$i")_outputs
done

这里额外添加了-f参数避免rm命令在文件不存在时报错,同时每次循环前清理旧的results目录,避免重复创建导致的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:45:30