Wie man den Rückgabewert aus matlab in der bash-Skript?
Wenn ich in diesem matlab-Funktion
function [result] = matlab_test(param1, param2)
disp(sprintf('param1 : %s', param1));
disp(sprintf('param2 : %s', param2));
result = 'hello matlab';
Und ich wollen, rufen Sie diese matlab-Funktion in bash-Skript wie
matlab -nodesktop -nosplash -nodisplay -r "try, A=matlab_test('test','matlab'); end; quit"
echo $A
Und ich will diese Ausgabe
test
matlab
hello matlab
Meine Anforderung ist hier zu finden, wenn es möglich ist, verwenden Sie den Rückgabewert aus Matlab in meinem bash-Skript und auch zu führen Sie es durch die pipeline. Ich will nur meine Programme getrennt in kleine Komponenten (Dateien) und die Kommunikation durch die pipeline/params. Kurz gesagt, ich möchte sehen, wie weit ich wickeln kann Matlab-Skript in meinem bash-Skript, damit kann ich mein code-Architektur.
Wenn ich dies nicht kann, werde ich einfach bundle das Teil, ich muss den Rückgabewert aus matlab zusammen in die matlab-Skript.
- Ich bearbeitet meine Antwort zu versuchen, eine Antwort auf deine geänderte Frage.
- Im Fall der Rückgabewert ist eine kleine integer-Zahl, eine einfache Lösung ist zurückgeben, da die Matlab-Prozess exit-code, mit dem
exit(code)
- Befehl. Vergessen Sie nicht, die-wait
command-line-argument zumatlab
wenn Sie versuchen, diese auf Windows.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du hast zwei Fragen. Werde ich beantworten, auch warum der zweite kann unmöglich sein, je nach Betriebssystem (und ganz sicher nicht auf mir), dann bieten einen Vorschlag, ein problem, abhängig Abhilfe.
Erste, benutze ich ein Skript bekommen, wenn Matlab für die Interaktion mit einer shell.
gibt Ausgabe:
So klar die beiden Versionen setzen von environment-Variablen nicht funktioniert. Dies führt uns zu der zweiten Frage.
Den Grund für das scheitern der 'echo' ist der, dass beide
system
undsetenv
erstellen Muscheln, die geschlossen sind, wenn Matlab geschlossen wird. Das heißt, Matlab cannot set environment-Variablen außerhalb der Hülle, von dem es aufgerufen.Gibt es eine Abhilfe für dieses für Windows-Systeme diskutiert in diesem posting, das nutzt ein tool von Microsoft. Auch erwähnt hier.
Glaube ich nicht, es ist ein workaround für *nix-Systeme zum setzen von environment-Variablen innerhalb von Matlab.
Hier ist eine Methode, das zu tun etwas ähnlich, was Sie beschrieben.
Ich gehe davon aus, dass die Verwendung von echo ist nicht das, was Sie wirklich wollen, zu tun. Eher, ich bin zu raten, dass Sie möchten, verwenden Sie die string-Ausgabe in der Umwelt gespeicherte Variablen in die weitere Arbeit mit den Befehlen oder Skripts in der shell. Eine mögliche Abhilfe wäre die folgende:
Angabe Ausgabe:
[XXXXXX@compute-0-138 ~]$ ./stack_ex_3 test matlab
Warnung: Keine window-system gefunden. Java-option 'MWT' ignoriert
Dies zeigt, dass der Befehl
echo $temp1
ausgewertet wurde in der subshell erstellt vonsetenv
und temp1 enthält den Wert zugewiesen werden. Das Ergebnis dieser Aufruf von der shell ist jetzt gespeichert in b (a hält 0 Erfolg). Es ist denkbar, dass Sie passieren könnte, das ganze, was Sie tun wollen, in die shell über den system-Befehl, so dass es läuft in der subshell. Wir müssten mehr wissen, die Besonderheiten Ihres Problems zu geben, eine vollständige Einschätzung dieser Ansatz allerdings.Bearbeitet und Nachbereitung **********************
Ist die nächste Sache zu wickeln Matlab und bash, die ich mir vorstellen kann ist folgender trick. Sie können pipe die Ausgabe des Matlab-Skripts zu
myresult.out
mit den folgenden:Können Sie grep die
grepMe
Linie vonmyresult.out
-, Rohr-sed, und wählen Sie nur den Teil der Ausgabezeile, die Sie brauchen, dann pipe, auf der Sie den rest Ihres Skripts. Das ist so nah wie ich denke, dass kann man zu dem, was Sie zu tun versuchen.Darüber nachgedacht in den letzten paar Tagen und dachte an etwas. Sie können verwenden Sie eine der MATLAB-Klone als ein #! Skript-interpreter. Meine Wahl ist dabei eine Oktave, etwa so:
printf setzt den Wert von A in die STANDARDAUSGABE und Sie können über die Pipeline von dort.
Nun die Oktave ist nicht genau das gleiche wie MATLAB, aber es ist in der Nähe, vielleicht genug für Ihre Bedürfnisse. Es hat auch den Vorteil des seins frei.
Gibt es zwei Dinge, die Sie versuchen, hier zu tun. Erstens: zeigt die Ausgabe des Matlab-Programm in einer shell. Zweitens weisen Sie eine variable in der shell.
Als ich dies versuchte, fand ich, dass Matlab zu schreiben, wäre alle über stdout mit seiner öffnung Nachricht, so landete ich zu tun:
und anschließend in matlab zu ersetzen
sprintf
mit:Dass ist eine Lösung, um Ihre erste Anforderung (Sie können schreiben Sie einfach eine normale Datei und dann cat die Datei danach aber müssten Sie verwendet
&&
, so dass Sie nicht sehen, die Ausgabe, bis Matlab war völlig fertig.). Das zweite Problem, das Sie haben, zu tun "A = Ergebnis" in matlab und in der Lage zu "echo" $A" in die Schale - härter ist. Sie könnten etwas tun wie:und in matlab:
aber ich weiß wirklich nicht, wie gut das funktionieren würde.