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
相关产品推荐
相关产品推荐

