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

Bash脚本重定向问题求助:处理测试文件时输出重定向失效

问题根源

你现在的写法是把每个重定向拆成了单独的count/exCount命令,相当于每次都重新运行一遍程序,而不是在同一次程序运行里完成输入、输出、错误的重定向。比如第13行是让count读$filename但输出到终端,第14行是count不读任何输入(因为没加< $filename),只把输出写到newOut,这完全不是你想要的效果。另外脚本里diff的时候用了myOut/myErr,但前面写的是newOut/newErr,变量名也不匹配。

修正后的脚本
# 定义FILES为当前目录下的所有文件,用数组避免文件名含空格时出错
FILES=(*)

for filename in "${FILES[@]}" ; do
    if [[ $filename == test* ]]; then
        echo "File starting: ${filename}"
        
        # 一次性完成count的输入、输出、错误重定向,再追加返回码
        count < "$filename" > newOut 2> newErr
        echo "Exit code: $?" >> newOut
        
        # 对exCount执行相同逻辑
        exCount < "$filename" > exOut 2> exErr
        echo "Exit code: $?" >> exOut
        
        # 对比两个程序的输出和错误文件
        diff1=$(diff newOut exOut)
        diff2=$(diff newErr exErr)
        
        echo "Test File ${filename}"
        echo "stdout diffs:"
        echo "$diff1"
        echo "stderr diffs:"
        echo "$diff2"
    fi
done
关键修正点
  • 把输入、标准输出、标准错误重定向合并到同一个count/exCount命令里:count < "$filename" > newOut 2> newErr,这样程序仅运行一次,同时完成输入读取、输出写入、错误写入。
  • 程序运行后立即用$?获取返回码,再追加到输出文件,避免重复运行程序导致结果不一致。
  • 修正diff时的文件名,将myOut/myErr改为newOut/newErr,和前面的输出文件对应。
  • 用"${FILES[@]}"遍历文件,避免文件名包含空格或特殊字符时出现异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:32:38