Git Bash调用Meshlabserver时txt读取的.mlx脚本路径提示不存在
问题原因与修复方案
核心问题
你遇到的报错由3个常见的Bash使用误区共同导致:
- 数组索引越界:Bash数组默认从
0开始编号,你用shuf -i 1-13生成随机数,假设script_list.txt有13个脚本,合法下标范围是0~12,生成13时会取到空值,就算生成1~12也会跳过第一个脚本。 - 路径带隐藏Windows换行符:如果是用Windows记事本生成的
script_list.txt,每行末尾是\r\n(Windows标准换行),mapfile -t只会删除末尾的\n,剩下的\r(回车符)会附着在$Script变量末尾。echo输出时\r会把光标挪到行首,肉眼看不到异常,但实际路径多了一个不可见字符,系统无法识别文件。 - 变量未加双引号:调用命令时
$Script没有包裹双引号,就算路径本身没有问题,只要路径包含空格、特殊字符就会被解析为多个参数,导致传参错误。
修复后代码
# 读取文件时自动删除每行末尾的\r,规避Windows换行符问题 mapfile -t myArray < <(sed 's/\r$//' "C:\My_Work_Files\Batch_resize_surfaces_test\script_list.txt") # 基于数组实际长度生成随机下标,后续新增脚本不需要修改硬编码数值 num=$(shuf -i 0-$(( ${#myArray[@]} - 1 )) -n 1) Script=${myArray[$num]} # 调用时给$Script加双引号,保证路径解析正确 "C:\Program Files\VCG\MeshLab\meshlabserver.exe" -i "$file" -s "$Script" -o "${file%.*}_deci.ply" -m vn
验证方法
如果需要排查变量是否包含隐藏字符,可以加一行调试命令查看二进制内容:
echo -n "$Script" | od -c
如果输出末尾显示\r,就说明存在隐藏换行符,用上述代码中的sed处理即可解决。
内容的提问来源于stack exchange,提问作者Antsushi
相关产品推荐
相关产品推荐

