你在問兩個問題。我會回答這兩個問題,包括爲什麼第二個可能不可能取決於您的操作系統(並且絕對不可能在我的系統上),然後針對問題相關的解決方法提供建議。
首先,我在使用Matlab與shell交互時使用這樣的腳本。
#!/bin/sh
cat <<EOF | matlab -nodesktop -nosplash -nodisplay
A=matlab_test('$1','$2');
system(['export temp1=' A]); %doesn't work
setenv('temp2',A); %also doesn't work, I'll explain why below
exit
EOF
echo $temp1
echo $temp2
給輸出:
[[email protected] ~]$ ./stack_ex test matlab
Warning: No window system found. Java option 'MWT' ignored
< M A T L A B (R) >
Copyright 1984-2010 The MathWorks, Inc.
Version 7.12.0.635 (R2011a) 64-bit (glnxa64)
March 18, 2011
To get started, type one of these: helpwin, helpdesk, or demo.
For product information, visit www.mathworks.com.
>> param1 : test
param2 : matlab
>> >> >>
所以明確設置環境變量的兩個版本無法正常工作。這導致我們回到第二個問題。
「回聲」失敗的原因是system
和setenv
都創建了當Matlab關閉時關閉的shell。也就是說,Matlab不能在調用它的shell之外設置環境變量。
對於使用微軟工具討論的in this posting的Windows系統,有一種解決方法。還提到了here。
我不相信有一種解決方法可以讓* nix系統在Matlab中設置環境變量。
下面是一個方法來做類似於你所描述的。
我假設使用回聲不是你真正想要做的。相反,我猜你希望使用存儲在環境變量中的字符串輸出,以用於進一步處理shell中的命令或腳本。一個可能的解決方法是以下幾點:
#!/bin/sh
cat <<EOF | matlab -nodesktop -nosplash -nodisplay
A=matlab_test('$1','$2');
setenv('temp1',A); %doesn't work
[a b] = system(['echo ' '$' 'temp1'])
exit
EOF
給予輸出: [XXXXXX @計算-0-138〜] $ ./stack_ex_3測試MATLAB 警告:未找到窗口系統。 java選項「MWT」忽略
< M A T L A B (R) >
Copyright 1984-2010 The MathWorks, Inc.
Version 7.12.0.635 (R2011a) 64-bit (glnxa64)
March 18, 2011
To get started, type one of these: helpwin, helpdesk, or demo.
For product information, visit www.mathworks.com.
>> param1 : test
param2 : matlab
>> >>
a =
0
b =
hello matlab
這表明命令echo $temp1
由setenv
和temp1中創建子shell評價認爲分配給它的價值。這個對shell的調用結果現在存儲在b中(保持0表示成功)。可以想象,您可以通過系統命令在shell中傳遞所有您想要執行的操作,以便它在子shell中運行。我們必須瞭解您的問題的更多細節,才能對此方法進行全面評估。
編輯和隨訪**********************
的最接近包裝Matlab和慶典,我能想到的是下面的技巧。可以通過管道從MATLAB腳本輸出到myresult.out
下列要求:
#!/bin/sh
cat <<EOF | matlab -nodesktop -nosplash -nodisplay /> myresult.out
A=matlab_test('$1','$2');
disp(['grepMe ' A])
exit
EOF
您可以從myresult.out
用grep的grepMe
線,管的sed,並選擇您需要的輸出線的只有一部分,然後通過管道將在你腳本的其餘部分。這與我認爲你可以達到你想要做的一樣接近。
我編輯了我的答案,試圖回答你修改後的問題。 – Sevenless 2012-04-11 17:41:16
如果返回值是一個小整數,一個簡單的解決方法是使用['exit(code)'](http://au.mathworks.com/help/matlab/)將它作爲Matlab進程的退出代碼返回。 ref/exit.html)命令。在Windows上嘗試此操作時,請不要忘記['-wait'](http://au.mathworks.com/help/matlab/ref/matlabwindows.html)''matlab'的命令行參數。 – 2016-05-22 09:10:09