You need to enable JavaScript to run this app. 执行含clrsh命令的.sh脚本时test.txt文件行未被完整读取的原因问询
优惠活动
大模型
产品
解决方案
定价
更多

执行含clrsh命令的.sh脚本时test.txt文件行未被完整读取的原因问询

问题根因

这个问题和循环逻辑无关,是clrsh命令的输入行为导致的:

  • 当你使用cat $filename | while read line的结构时,整个while循环的标准输入都绑定在cat命令输出的管道流上
  • 第一次循环时read命令读取了管道中的第一行内容,剩余的第二行还留在输入缓冲区中
  • clrsh作为远程执行类命令,默认会主动读取所有可用的标准输入内容,执行第一次循环的clrsh时,它会把缓冲区里剩下的第二行内容全部消费掉
  • 第二次循环执行read时,管道中已经没有剩余内容,循环直接终止,所以只会处理第一行
  • 本地执行的csum命令不会主动读取标准输入,不会消耗管道中的剩余内容,因此循环可以正常处理所有行
修复方案

方案1:重定向clrsh的标准输入为空(最简便)

在clrsh命令后添加< /dev/null,强制它从空设备读取输入,不会占用循环的管道流:

#!/bin/sh
filename='test.txt'
cat $filename | while read line;do
 clrsh server1 csum -h MD5 $line < /dev/null
done

方案2:改用文件重定向输入循环(避免管道共用标准输入)

直接将文件内容重定向给while循环的输入,稳定性更高:

#!/bin/sh
filename='test.txt'
while read line;do
 clrsh server1 csum -h MD5 "$line" < /dev/null
done < "$filename"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 13:54:04