2つの質問があります。私はあなたのオペレーティングシステムに応じて2つ目のものが不可能になる(そして私の場合は絶対不可能かもしれない)理由を含めて、両方に答えて、問題に応じた回避策を提案します。
まず、このようなスクリプトを使用して、MATLABがシェルと対話するようにします。
#!/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
>> >> >>
だから、明確に環境変数を設定することの2つのバージョンが動作しません。これはあなたの2番目の質問につながります。
「エコー」に失敗した理由は、system
とsetenv
の両方が、Matlabが閉じられたときに閉じるシェルを作成することです。つまり、Matlabはシェルと呼ばれるシェルの外に環境変数を設定することはできません。
マイクロソフトのツールを使用しているin this postingで説明されているWindowsシステムの場合、この問題を回避する方法があります。また、hereも参照してください。
* nixシステムがMatlabから環境変数を設定するための回避策はないと思います。
ここでは、説明したのと同様の操作を行う方法を示します。
私はあなたが実際にしたいことではないエコーの使用を前提としています。むしろ、環境変数に格納されている文字列出力を使用して、シェル内のコマンドやスクリプトを使用する場合に使用すると思います。一つの可能な回避策は、次のようになります。
#!/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は」このコマンドecho $temp1
がsetenv
とTEMP1により作成されたサブシェルで評価されたことを示し、それに割り当てられた値を保持している
< 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
を無視しました。このシェルの呼び出しの結果は、b(aは成功を示す0を保持する)に格納されます。シェルで実行したいことの全てをシステムコマンドで渡すことができるので、サブシェルで実行することが考えられます。私たちはこのアプローチの完全な評価をするために、あなたの問題の詳細をもっと知る必要があります。
編集とフォロー**********************
MATLABと私は考えることができるのbashをラップに最も近いものは、次のトリックです。パイプを使用して、次のとmyresult.out
にMATLABスクリプトからの出力ができます。
#!/bin/sh
cat <<EOF | matlab -nodesktop -nosplash -nodisplay /> myresult.out
A=matlab_test('$1','$2');
disp(['grepMe ' A])
exit
EOF
パイプを使用し、その後、パイプはsedのために、myresult.out
からgrepMe
行をgrepして、必要な出力ラインの一部のみを選択することができますあなたのスクリプトの残りの部分にそれは私があなたがしようとしているものに到達できると思うほど近いです。
改訂された質問に答えるために私の答えを編集しました。 – Sevenless
戻り値が小さい整数の場合、簡単な解決策は、[exit(code) '](http://au.mathworks.com/help/matlab/)を使用して、Matlabプロセスの終了コードとして返すことです。 ref/exit.html)コマンドを使用します。 Windowsでこれを試すときは、 '' -wait'](http://au.mathworks.com/help/matlab/ref/matlabwindows.html)の 'matlab'へのコマンドライン引数を忘れないでください。 –