从cygwin中调用(bash)shell脚本的matlab函数时,我有一个奇怪的问题。
这是有问题的命令:
"$MATLAB_PATH/matlab" -wait -nojvm -nosplash -automation -logfile "$MATLAB_LOGFILE" -r "myFunction $(echo ${FUNCTION_ARGS[@]}); quit;"
在BASH命令行上的echoed
时,将评估以下内容:
/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 session(即不是自动化服务器)时,似乎没有问题,并且该功能在所有〜30上都可以正常执行争论。 - 当我减少命令行的长度(例如,通过删除
-wait
选项)时,MATLAB函数将突然收到18个参数,最后一个参数是18 th string的一部分我传递了。 - 将命令行长度减少或增加几个字符,以其他方式(重复路径中的斜线,复制空间等)没有效果。
- 编辑:复制命令行长似乎具有
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字符。
MATLAB处理命令行的处理可能存在限制。例如,分配给该功能的缓冲区的长度可能限制为1014个字符。
在脚本中,将函数调用保存在脚本中,然后尝试将脚本传递给命令行上的matlab。
http://www.mathworks.com/help/matlab/ref/matlabwindows.html说:
matlab -r"语句"启动MATLAB并执行指定的MATLAB语句。如果语句是MATLAB函数或脚本的名称,请不要指定文件扩展名。任何必需的文件都必须在MATLAB搜索路径或启动文件夹中。