【问题标题】:Maximum command length not reached, yet still exceeded未达到最大命令长度,但仍超过
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多