MPSoCBench仿真输出无法通过Bash脚本重定向至文件的问题
问题排查与修复方案
看起来你的脚本里有几个容易忽略的问题,导致输出没法正常写入文件,甚至部分命令根本没正确执行。咱们一步步来梳理和修复:
首先说几个核心问题
- 命令语法错误:你第一行写的
source env.sh echo "Simulation start"是错的!source会把后面的echo和字符串当成env.sh的参数,而不是先加载环境变量再执行echo。这会导致环境变量加载失败,后续的MPSoCBench可能找不到依赖,echo也不会正常输出。必须把这两个命令分开(换行或者用分号隔开)。 - 输出目录不存在:如果
output/MIPS/stringsearch这类嵌套目录没提前创建,Bash的重定向>会直接报错,根本生成不了文件。得先把所有需要的目录建好。 - 只重定向了标准输出:很多仿真程序会把错误信息或者关键日志输出到标准错误(stderr),你只用
>的话,只会把标准输出(stdout)写到文件,stderr还是会跑到终端里,等于丢了一部分日志。得把stderr也重定向进去。 - 重复代码太多,容易出错:你的脚本里一堆重复的命令,不仅写起来麻烦,还容易漏写(比如最后一行的
./MPSoCBench根本不完整),用循环简化后能少很多错误。
修复后的完整脚本
#!/bin/bash # 先加载环境变量,再打印启动提示 source env.sh echo "Simulation start" # 定义所有需要测试的参数,后续改参数直接改这里就行 ARCH_LIST=("mips" "arm") BENCHMARK_LIST=("stringsearch" "dijkstra" "sha" "basicmath" "susanedges" "susansmoothing" "susancorners") CORE_COUNT_LIST=(1 2 4 8) CONFIG_FILE="noc.lt" # 递归创建所有需要的输出目录,避免目录不存在的问题 for arch in "${ARCH_LIST[@]}"; do for benchmark in "${BENCHMARK_LIST[@]}"; do mkdir -p "output/${arch}/${benchmark}" done done # 批量执行所有仿真任务 for arch in "${ARCH_LIST[@]}"; do echo "=== 开始执行${arch}架构的仿真任务 ===" for benchmark in "${BENCHMARK_LIST[@]}"; do for core_num in "${CORE_COUNT_LIST[@]}"; do output_path="output/${arch}/${benchmark}/${benchmark}-${core_num}.out" echo "正在运行:${benchmark} (${arch}, ${core_num}核),日志写入${output_path}" # 同时重定向stdout和stderr到文件,用&>或者2>&1都可以 ./MPSoCBench -p="${arch}" -s="${benchmark}" -i="${CONFIG_FILE}" -n="${core_num}" -r &> "${output_path}" # 检查命令是否执行成功,方便排查问题 if [ $? -ne 0 ]; then echo "⚠️ 错误:${benchmark} (${arch}, ${core_num}核) 执行失败,请查看${output_path}获取详情" fi done done done echo "=== 所有仿真任务执行完成 ==="
几个关键改进的说明
mkdir -p:递归创建目录,不管父目录存在与否都能生成完整的路径,彻底解决目录缺失导致的重定向失败问题。&>:一次性把标准输出和标准错误都重定向到文件,确保所有日志都被保存下来,不会漏掉错误信息。- 参数化循环:用数组定义所有测试组合,后续要加新的基准测试、核心数或者架构,直接修改数组就行,不用复制粘贴一堆命令。
- 执行状态检查:每次仿真后检查退出码,要是执行失败会立刻提示,方便你快速定位有问题的任务。
- 过程提示:添加了清晰的执行日志,你能实时看到当前在跑哪个任务,不用瞎等。
内容的提问来源于stack exchange,提问作者Alexandre Krabbe
相关产品推荐
相关产品推荐

