Zadajesz dwa pytania. Odpowiem na oba pytania, w tym na pytanie, dlaczego drugi może być niemożliwy w zależności od systemu operacyjnego (a na pewno niemożliwy w moim), a następnie proponuję obejście problemu zależne od tego rozwiązania.
Po pierwsze, używam takiego skryptu, aby zmusić Matlaba do interakcji z powłoką.
#!/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
daje wyjście:
[[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
>> >> >>
więc wyraźnie dwie wersje Ustawianie zmiennych środowiskowych nie działa. To prowadzi nas do twojego drugiego pytania.
Powodem niepowodzenia "echo" jest to, że zarówno system
, jak i setenv
tworzą powłoki zamknięte po zamknięciu Matlaba. Oznacza to, że Matlab nie może ustawić zmiennych środowiskowych poza powłoką, która go nazwała.
Istnieje obejście tego problemu dla systemów Windows omówione in this posting, który używa narzędzia firmy Microsoft. Wymieniono również here.
Nie wierzę, że istnieje obejście dla systemów * nix do ustawiania zmiennych środowiskowych z poziomu programu Matlab.
Oto metoda na zrobienie czegoś podobnego do opisanego.
Zakładam, że użycie echa nie jest tym, co faktycznie chcesz zrobić. Raczej zgaduję, że chciałbyś użyć wyjścia łańcuchowego zapisanego w zmiennej środowiskowej do użycia w dalszej pracy z komendami lub skryptami w powłoce. Jednym z możliwych Rozwiązaniem byłoby następujące:
#!/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
Nadanie wyjściowa: [XXXXXX @ Compute-0-138 ~] $ ./stack_ex_3 Test Matlab Ostrzeżenie: Nie znaleziono system okienny. opcji wcześniejszej Java MWT 'ignorowane
< 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
To pokazuje, że komenda echo $temp1
oceniano w podpowłoce stworzonej przez setenv
i temp1 posiada wartość przypisaną do niego. Wynik tego połączenia do powłoki jest teraz przechowywany w b (a zawiera 0 oznaczające powodzenie). Można sobie wyobrazić, że możesz przekazać całość tego, co chcesz zrobić w powłoce za pomocą polecenia systemowego, tak aby działała w podpowłoce. Musimy jednak poznać więcej szczegółów na temat twojego problemu, aby udzielić pełnej oceny tego podejścia.
zmiany i nawiązanie **********************
najbliższa rzecz do owijania Matlab i bash, że mogę myśleć jest następujący trik . Można rura wyjście ze skryptu Matlab do myresult.out
z następujących czynności:
#!/bin/sh
cat <<EOF | matlab -nodesktop -nosplash -nodisplay /> myresult.out
A=matlab_test('$1','$2');
disp(['grepMe ' A])
exit
EOF
można grep linię grepMe
z myresult.out
, rura do sed, i wybrać tylko część linii wyjściowej trzeba, to rura że w pozostałej części skryptu. To jest tak blisko, jak myślę, że możesz dostać się do tego, co próbujesz zrobić.
Edytowałem swoją odpowiedź, aby spróbować odpowiedzieć na zmienione pytanie. – Sevenless
W przypadku, gdy zwracana wartość jest małą liczbą całkowitą, prostym rozwiązaniem jest zwrócenie jej jako kodu wyjścia procesu Matlaba przy użyciu opcji ['exit (code)'] (http://au.mathworks.com/help/matlab/ ref/exit.html). Nie zapomnij o argumentach polecenia '-wait' (http://au.mathworks.com/help/matlab/ref/matlabwindows.html) na' matlab' przy próbie tego w systemie Windows. –