【发布时间】:2014-02-15 18:08:33
【问题描述】:
从 CygWin 中运行的 (bash) shell 脚本调用 MATLAB 函数时,我遇到了一个奇怪的问题。
这是有问题的命令:
"$MATLAB_PATH/matlab" -wait -nojvm -nosplash -automation -logfile "$MATLAB_LOGFILE" -r "myFunction $(echo ${FUNCTION_ARGS[@]}); quit;"
当 echoed 在 bash 命令行上时,计算结果如下:
/cygdrive/c/Program Files (x86)/MATLAB/R2010a/bin/matlab -wait -nojvm \
-nosplash -automation -logfile MATLAB_output.txt -r myFunction \
/path/to/relevant/data/data1.txt /path/to/other/relevant/data/data2.txt \
<<several more such arguments>>; quit;
命令的总长度约为 2000 个字符,具体取决于调用脚本的路径。
问题是我的 MATLAB 函数只接收 17 个参数(约 1017 个字符),而我发送的参数却远远超过 30 个。
其他观察到的行为:
- 当我将
echoed命令行复制粘贴到 常规 MATLAB 会话(即不是自动化服务器)中时,似乎没有问题,并且该函数在所有服务器上都可以正常执行约 30 个参数。 - 当我减少命令行的长度时(例如,通过删除
-wait选项),MATLAB 函数会突然收到 18 个参数,最后一个参数是第 18 个的一部分 我传入的字符串。 - 以其他方式(在路径中复制斜杠、复制空格等)将命令行长度减少或增加几个字符无效。
-
编辑:复制粘贴的命令行长度似乎最大为
1014个字符。
显然,在工具链的某个地方,命令的最大长度是有限制的。我在 MATLAB、其自动化服务器、bash 或 CygWin 的文档中没有找到任何相关内容——它们都有限制,但更多的是 32K 字符,比我传入的要多。
所以...我很茫然。我不确定如何诊断导致此问题的工具...有什么想法吗?
编辑:
xargs --show-limits的输出:
Your environment variables take up 5556 bytes
POSIX upper limit on argument length (this system): 24396
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 18840
Size of command buffer we are actually using: 24396
expr $(getconf ARG_MAX) - $(env|wc -c) - $(env|wc -l) \* 4 - 2048的输出:
24098
所以,正如我所说,即使是最小的字符也不能接近我的约 2000 个字符。
【问题讨论】:
-
第17、18、19个参数有什么特别之处吗?它们可能包含无效或未转义的字符或自动化服务器不喜欢的某些字符吗?您说您将回显版本复制并粘贴到非自动化服务器 Matlab 中 - 您也可以尝试直接运行它(复制/粘贴不能总是被信任)吗?此外,最好确认问题出在输入的长度而不是参数的数量上,那么是否可以使用一堆非常短的参数进行测试?
-
@horchler:我将所有数据文件与 MATLAB 脚本放在同一目录中,全部位于
C:\T。该调用将正确数量的参数导入 MATLAB。然后,当我将所有数据文件放在目录C:\some\super\deeply\nested\directory\just\to\inrease\argument\lengths中时,MATLAB 脚本会看到一半的参数并在最后一个参数中接收到部分字符串。进一步的实验表明,该命令可能具有的最大字符数是非明显特殊的1014。
标签: bash matlab automation cygwin