Usted hace dos preguntas. Responderé a ambos, incluido el por qué el segundo podría ser imposible dependiendo de tu sistema operativo (y definitivamente imposible en el mío), y luego ofreceré una sugerencia sobre una solución alternativa dependiente del problema.
En primer lugar, uso un script como este para hacer que Matlab interactúe con un 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
da salida:
[[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
>> >> >>
Así que claramente las dos versiones de las variables de entorno de ajuste no funciona. Esto nos lleva a su segunda pregunta.
La razón detrás de la falla al 'eco' es que tanto system
como setenv
crean depósitos que están cerrados cuando Matlab está cerrado. Es decir, Matlab no puede establecer variables de entorno fuera del shell que lo llamó.
Hay una solución para esto para los sistemas Windows que se tratan in this posting, que utiliza una herramienta de Microsoft. También se menciona here.
No creo que haya una solución para que los sistemas * nix establezcan variables de entorno desde dentro de Matlab.
Aquí hay un método para hacer algo similar a lo que describió.
Supongo que el uso del eco no es lo que realmente desea hacer. Más bien, supongo que le gustaría usar la salida de cadena almacenada en la variable de entorno para usarla en futuros trabajos con comandos o scripts en el shell. Una posible solución sería la siguiente:
#!/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
salida de Dar: [XXXXXX @ compute-0-138 ~] $ ./stack_ex_3 MATLAB prueba Advertencia: No se encuentra el sistema de ventanas. opción de Java 'MWT' ignorado
< 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
Esto demuestra que el comando echo $temp1
se evaluó en el subnivel creado por setenv
y Temp 1 contiene el valor asignado a la misma. El resultado de esta llamada al shell ahora se almacena en b (a mantiene 0 indicando éxito). Es concebible que pueda pasar todo lo que le gustaría hacer en el shell a través del comando del sistema, para que se ejecute en la subshell. Sin embargo, deberíamos conocer más detalles de su problema para ofrecer una evaluación completa de este enfoque.
ediciones y seguimiento **********************
Lo más parecido a envolver Matlab y bash que se me ocurre es el siguiente truco . Puede canalizar la salida de la secuencia de comandos de Matlab a myresult.out
con lo siguiente:
#!/bin/sh
cat <<EOF | matlab -nodesktop -nosplash -nodisplay /> myresult.out
A=matlab_test('$1','$2');
disp(['grepMe ' A])
exit
EOF
Puede buscando la línea grepMe
de myresult.out
, tubería de sed, y seleccionar sólo la parte de la línea de salida que necesita, entonces tubería que en el resto de tu script Eso es lo más cerca que creo que puedes llegar a lo que estás tratando de hacer.
He editado mi respuesta para tratar de responder a su pregunta revisada. – Sevenless
En caso de que el valor de retorno sea un número entero pequeño, una solución simple es devolverlo como el código de salida del proceso de Matlab, utilizando ['exit (code)'] (http://au.mathworks.com/help/matlab/ ref/exit.html) comando. No olvide el argumento de la línea de comandos ['-wait'] (http://au.mathworks.com/help/matlab/ref/matlabwindows.html) para' matlab' cuando intente esto en Windows. –