あなたは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
出力を与えます:
[XXXXXX@compute-0-138 ~]$ ./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 番目の質問につながります。
「エコー」の失敗の背後にある理由は、Matlab が閉じられたときに閉じられるシェルを作成することですsystem
。setenv
つまり、Matlab はそれを呼び出したシェルの外部で環境変数を設定できません。
この投稿で説明されている Windows システムには、Microsoft のツールを使用する回避策があります。ここ にも記載されています。
*nix システムが Matlab 内から環境変数を設定するための回避策はないと思います。
これは、あなたが説明したものと同様のことを行う方法です。
echo の使用は、実際にやりたいことではないと思います。むしろ、環境変数に格納された文字列出力を使用して、シェル内のコマンドまたはスクリプトでさらに作業を行うことをお勧めします。考えられる回避策の 1 つは、次のとおりです。
#!/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@compute-0-138 ~]$ ./stack_ex_3 test 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 に割り当てられた値が保持されていることを示しています。このシェルへの呼び出しの結果は、b に格納されます (a は成功を示す 0 を保持します)。サブシェルで実行されるように、システムコマンドを介してシェルで実行したいことのすべてを渡すことができると考えられます。ただし、このアプローチを完全に評価するには、問題の詳細を知る必要があります。
編集とフォローアップ **********************
私が考えることができる Matlab と bash のラッピングに最も近いのは、次のトリックです。Matlab スクリプトからの出力をmyresult.out
次のようにパイプすることができます。
#!/bin/sh
cat <<EOF | matlab -nodesktop -nosplash -nodisplay /> myresult.out
A=matlab_test('$1','$2');
disp(['grepMe ' A])
exit
EOF
grepMe
から行をgrepし、myresult.out
sedにパイプし、必要な出力行の部分のみを選択してから、スクリプトの残りの部分にパイプします。それは、あなたがやろうとしていることにあなたが到達できると私が思うのと同じくらい近いです.