從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個參數,最後一個參數是我傳入的字符串的一部分。 - 以其他方式減少或增加命令行長度幾個字符(複製路徑中的斜槓,複製空格等)不起作用。
- 編輯:複製粘貼的命令行長度似乎最大長度爲
1014
個字符。
顯然,在工具鏈的某個地方,命令可以有的最大長度是有限制的。我沒有在MATLAB,它的自動化服務器,bash或CygWin文檔中發現任何相關內容 - 它們都有限制,但更多的是32K字符的順序,比我通過的方式多。
所以......我不知所措。我不知道如何診斷哪個工具造成這個......任何想法?
編輯:輸出xargs --show-limits
的 :
expr $(getconf ARG_MAX) - $(env|wc -c) - $(env|wc -l) \* 4 - 2048
的
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
:
24098
所以,正如我所說的,即使是最小的,這些不來接近我〜2000字符。
17,18,19個參數還有什麼特別之處嗎?他們可能包括一個無效或未轉義的字符或一些自動化服務器不喜歡的字符?你說你複製並粘貼到非自動化服務器Matlab的回顯版本 - 你也可以嘗試直接運行它(複製/粘貼不總是可信)?另外,它可以很好地確認問題與輸入的長度而不是參數的數量有關,那麼是否可以用一堆非常短的參數進行測試? – horchler
@horchler:我把所有的數據文件放在與MATLAB腳本相同的目錄中,全部位於'C:\ T'中。該調用將正確數量的參數傳入MATLAB。然後,當我把所有的數據文件放在目錄'C:\ some \ super \ deeply \ nested \ directory \ just \ to \ inrease \ argument \ lengths'中時,MATLAB腳本會看到一半的參數並在最後接收到部分字符串論據。進一步的實驗表明,命令可能具有的最大字符數是不明顯的特殊「1014」。 –