Ответ 1
Вы задаете два вопроса. Я отвечу на оба вопроса, в том числе на то, почему второй может быть невозможным в зависимости от вашей операционной системы (и, безусловно, невозможно на моем), затем предложите предложение об зависимом от проблемы обходном пути.
Во-первых, я использую script, как это, когда 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
>> >> >>
Таким образом, две версии переменных среды установки не работают. Это приводит нас к вашему второму вопросу.
Причина отказа "эха" заключается в том, что как system
, так и setenv
создают оболочки, закрытые при закрытии Matlab. То есть, Matlab не может устанавливать переменные среды вне оболочки, которая его вызывала.
Там обходной путь для систем Windows обсуждался здесь.
Я не верю, что обходной путь для * 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 @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 hold 0 указывает на успех). Вполне возможно, что вы могли бы передать все то, что вы хотели бы сделать в оболочке через системную команду, чтобы она выполнялась в подоболочке. Мы должны были бы узнать больше специфики вашей проблемы, чтобы дать полную оценку этого подхода.
Изменения и последующие действия **********************
Ближайшая вещь для упаковки Matlab и bash, о которой я могу думать, это следующий трюк. Вы можете вывести вывод из Matlab script в myresult.out
со следующим:
#!/bin/sh
cat <<EOF | matlab -nodesktop -nosplash -nodisplay /> myresult.out
A=matlab_test('$1','$2');
disp(['grepMe ' A])
exit
EOF
Вы можете выполнить grep строку grepMe
от myresult.out
, pipe to sed и выбрать только часть нужной строки, а затем передать ее на оставшуюся часть вашего script. Это как можно ближе к тому, что вы пытаетесь сделать.