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

