未达到最大命令长度,但仍超出

时间:2014-01-24 16:42:31

标签: bash matlab automation cygwin

从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会话(即不是自动化服务器)时,似乎没有问题,并且该函数执行得很好在所有~30个论点上。
  • 当我减少命令行的长度时(例如,通过删除-wait选项),MATLAB函数将突然接收18个参数,最后一个参数是18 th <的一部分/ sup>我传入的字符串。
  • 以其他方式减少或增加命令行长度几个字符(复制路径中的斜杠,复制空格等)无效。
  • 编辑:复制粘贴的命令行长度似乎最长为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个字符。

1 个答案:

答案 0 :(得分:0)

Matlab处理命令行可能存在限制。例如,为函数分配的缓冲区长度可以限制为1014个字符。

在脚本中,将函数调用保存在脚本中,并尝试在命令行上将脚本传递给Matlab。

http://www.mathworks.com/help/matlab/ref/matlabwindows.html说:

  

matlab -r“statement”启动MATLAB并执行指定的MATLAB语句。如果statement是MATLAB函数或脚本的名称,请不要指定文件扩展名。任何必需的文件必须位于MATLAB搜索路径或启动文件夹中。