为什么我的循环首次执行后就终止?遍历CSV调用Blender渲染仅跑第一条记录
循环提前终止的核心原因
两个问题叠加导致脚本仅完成第一次渲染就退出:
- 循环内部误用
exec命令:exec的作用是用启动的新进程完全替换当前Shell进程,不会生成独立子进程。第一次执行到Blender启动行时,原本负责驱动while循环的Shell进程就被Blender进程替代,Blender渲染结束后直接退出整个脚本,没有剩余的Shell进程继续读取CSV的后续行,循环自然中断。 - 未隔离Blender的标准输入流:哪怕去掉
exec关键字,Blender这类批处理程序默认会从当前绑定的标准输入(也就是while循环读取的blend.csv文件流)读取内容,第一次启动Blender时会把CSV中剩余的3条数据全部从stdin流中读走,等Blender执行完成回到循环时,stdin已经没有剩余内容可供read命令读取,循环同样会提前终止。
补充说明:你脚本里写的
exec </Applications/Blender.app/...属于重定向位置书写错误,Bash会将这个写法等价解析为Blender命令将标准输入绑定到Blender自身的二进制文件,并非启动Blender的正确写法。
正确修复方案
修改后的脚本需要满足三个核心要求:
- 去掉循环内部的
exec关键字,让Blender作为循环的子进程运行,保证Shell进程可以在Blender执行完成后继续驱动循环。 - 给Blender命令显式绑定空的标准输入源(通用写法为
</dev/null),切断Blender对循环所持有的CSV文件流的读取,避免它吃掉后续的CSV数据。 - 给传入Blender的参数加双引号包裹,避免取值中包含空格时被拆分为多个参数导致解析异常。
修改后的参考脚本:
#!/bin/bash while IFS=, read -r id text do echo "from csv $id $text" /Applications/Blender.app/Contents/MacOS/Blender -b ImageText.blend --python ImpostScript.py -- "$id" "$text" </dev/null done <blend.csv
内容的提问来源于stack exchange,提问作者xoail
相关产品推荐
相关产品推荐

