tee命令在Bash脚本中失效但终端正常的问题排查
我来帮你搞定这个问题!你遇到的核心麻烦其实是输出缓冲机制在作祟,再加上脚本执行环境的几个小细节没踩对。咱们一步步拆解解决:
为什么终端里只有退出才写入文件?
当程序把输出直接送到终端时,系统默认用行缓冲——每输出一行就立刻显示。但如果输出是通过管道或者重定向到文件,系统会自动切换成块缓冲:攒够一大块数据才会写入文件,直到程序退出时才强制刷新缓冲区,所以你看不到实时写入的效果。
脚本执行异常的可能原因
- 工作目录不匹配:如果
cpuminer-multi/cpuminer是相对路径,而你执行脚本的目录不是它所在的目录,就会出现找不到程序的错误。 - 用了非Bash的Shell执行:比如用
sh start.sh运行脚本,但进程替换这类特性是Bash专属的,其他Shell可能不支持。 - 缓冲问题没解决:和终端里的情况一样,脚本里的输出还是块缓冲,导致你误以为脚本“异常”。
解决方案
下面给你两种可靠的实现方式,选一个顺手的就行:
方法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
最后必做的小操作
- 给脚本加执行权限:
chmod +x start.sh
- 用Bash执行脚本(避免用
sh):
./start.sh
这样修改后,cpuminer的每一行输出都会实时显示在屏幕上,含"CPU"的行也会立刻追加到cpu.txt,脚本执行也不会再有异常啦!
内容的提问来源于stack exchange,提问作者Tristus
相关产品推荐
相关产品推荐

