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

tee命令在Bash脚本中失效但终端正常的问题排查

我来帮你搞定这个问题!你遇到的核心麻烦其实是输出缓冲机制在作祟,再加上脚本执行环境的几个小细节没踩对。咱们一步步拆解解决:

为什么终端里只有退出才写入文件?

当程序把输出直接送到终端时,系统默认用行缓冲——每输出一行就立刻显示。但如果输出是通过管道或者重定向到文件,系统会自动切换成块缓冲:攒够一大块数据才会写入文件,直到程序退出时才强制刷新缓冲区,所以你看不到实时写入的效果。

脚本执行异常的可能原因

  1. 工作目录不匹配:如果cpuminer-multi/cpuminer是相对路径,而你执行脚本的目录不是它所在的目录,就会出现找不到程序的错误。
  2. 用了非Bash的Shell执行:比如用sh start.sh运行脚本,但进程替换这类特性是Bash专属的,其他Shell可能不支持。
  3. 缓冲问题没解决:和终端里的情况一样,脚本里的输出还是块缓冲,导致你误以为脚本“异常”。

解决方案

下面给你两种可靠的实现方式,选一个顺手的就行:

方法1:stdbuf+进程替换(简洁高效)

修改你的start.sh脚本内容如下:

#!/bin/bash

# 先切换到cpuminer所在的目录(把路径改成你的实际路径,比如/home/you/miner/)
cd /path/to/your/cpuminer-multi/

# 强制行缓冲+双输出处理
stdbuf -oL ./cpuminer -u user -p pass -a sha256d -o stratum+tcp://stratum.pool.com:3333 -t cputhreads | tee >(grep "CPU" >> cpu.txt)
  • stdbuf -oL:强制让cpuminer的标准输出变成行缓冲,确保每一行都实时输出。
  • tee >(grep "CPU" >> cpu.txt):tee会把输出同时送到屏幕,还会把内容传给后面的grep进程,自动筛选出含"CPU"的行追加到cpu.txt。

方法2:while循环逐行处理(更直观)

如果你觉得进程替换有点绕,也可以用循环逐行处理:

#!/bin/bash

cd /path/to/your/cpuminer-multi/

stdbuf -oL ./cpuminer -u user -p pass -a sha256d -o stratum+tcp://stratum.pool.com:3333 -t cputhreads | while read -r line; do
    # 先把行输出到屏幕
    echo "$line"
    # 判断是否包含"CPU",是的话追加到文件
    if [[ "$line" == *CPU* ]]; then
        echo "$line" >> cpu.txt
    fi
done

最后必做的小操作

  1. 给脚本加执行权限:
chmod +x start.sh
  1. 用Bash执行脚本(避免用sh):
./start.sh

这样修改后,cpuminer的每一行输出都会实时显示在屏幕上,含"CPU"的行也会立刻追加到cpu.txt,脚本执行也不会再有异常啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:36:39