Bash中用循环替代进程替换未达预期的原因咨询
问题原因分析
先还原你大概率用到的两种循环写法:
失效的for循环写法(推测):
for col in 1 2; do tee >(cut -f$col | sort -u > words$col.txt) < users.txt done
正常工作的for循环写法:
for col in 1 2; do cat users.txt | cut -f$col | sort -u > words$col.txt done
失效核心原因
问题出在文件输入的读取逻辑上:
- 用
< users.txt直接给tee当输入时,第一次循环会把users.txt的内容一次性读完,文件内部的读取指针会直接跳到文件末尾。 - 第二次循环执行时,再次打开同一个文件,默认会从上次停留的指针位置(文件末尾)开始读取,自然读不到任何内容,所以后续生成的文件只有空白或仅残留极少量数据。
而用cat users.txt | ...的写法时,每次循环都会重新运行cat命令,cat会重新打开并完整读取users.txt的内容,所以每一次循环都能拿到全量数据,处理结果自然正常。
修复建议
如果想保留tee的写法,只要确保每次循环都重新读取完整文件即可,比如改成:
for col in 1 2; do cat users.txt | tee >(cut -f$col | sort -u > words$col.txt) > /dev/null done
内容的提问来源于stack exchange,提问作者4v1
相关产品推荐
相关产品推荐

