Stai facendo due domande. Risponderò a entrambi, compreso perché il secondo potrebbe essere impossibile a seconda del sistema operativo (e sicuramente impossibile per il mio), quindi offrire un suggerimento su una soluzione alternativa al problema.
Per prima cosa, uso uno script come questo quando faccio in modo che Matlab interagisca con una 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
dà uscita:
[[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
>> >> >>
Così chiaramente le due versioni delle variabili di ambiente non funziona. Questo ci porta alla tua seconda domanda.
Il motivo alla base dell'errore di "echo" è che sia system
sia setenv
creano shell che vengono chiuse quando Matlab viene chiuso. Vale a dire, Matlab non può impostare variabili d'ambiente al di fuori della shell che lo ha chiamato.
C'è un rimedio per questo per i sistemi Windows discusso in this posting, che utilizza uno strumento di Microsoft. Anche menzionato here.
Non credo ci sia una soluzione alternativa per i sistemi * nix per impostare le variabili di ambiente da Matlab.
Ecco un metodo per fare qualcosa di simile a quello che hai descritto.
Suppongo che l'uso dell'eco non sia ciò che si desidera effettivamente fare. Piuttosto, suppongo che ti piacerebbe utilizzare l'output di stringa memorizzato nella variabile di ambiente da utilizzare in ulteriori lavori con comandi o script nella shell. Una possibile soluzione potrebbe essere la seguente:
#!/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
uscita Dare: [XXXXXX @ compute-0-138 ~] $ ./stack_ex_3 prova MATLAB Attenzione: Nessun sistema a finestre trovato. opzione Java 'MWT' ignorato
< 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
Questo dimostra che il comando echo $temp1
è stata valutata nella subshell creato da setenv
e temp1 detiene il valore assegnato ad esso. Il risultato di questa chiamata alla shell è ora memorizzato in b (a detiene 0 che indica il successo). È concepibile che tu possa passare l'intero di ciò che vorresti fare nella shell attraverso il comando di sistema, in modo che venga eseguito nella sottochiave. Dovremmo conoscere più specifiche del tuo problema per dare una valutazione completa di questo approccio.
modifiche e follow **********************
La cosa più vicina al confezionamento Matlab e bash che mi viene in mente è il seguente trucco . È possibile reindirizzare l'output dello script Matlab per myresult.out
con il seguente:
#!/bin/sh
cat <<EOF | matlab -nodesktop -nosplash -nodisplay /> myresult.out
A=matlab_test('$1','$2');
disp(['grepMe ' A])
exit
EOF
È possibile grep la linea grepMe
da myresult.out
, tubo per sed, e selezionare solo la parte della linea di uscita è necessario, allora tubo che sul resto del tuo copione. È così vicino come penso che tu possa arrivare a quello che stai cercando di fare.
Ho modificato la mia risposta per provare a rispondere alla domanda rivista. – Sevenless
Nel caso in cui il valore restituito sia un numero intero piccolo, una soluzione semplice è restituirlo come codice di uscita del processo Matlab, utilizzando ['exit (code)'] (http://au.mathworks.com/help/matlab/ ref/exit.html) comando. Non dimenticare l'argomento della riga di comando ['-wait'] (http://au.mathworks.com/help/matlab/ref/matlabwindows.html) su' matlab' quando si prova su Windows. –