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

