如何从bash脚本中获取matlab的返回值?
如果我有这个matlab函数
function [result] = matlab_test(param1,param2) disp(sprintf('param1 : %s',param1)); disp(sprintf('param2 : %s',param2)); result = 'hello matlab'; 我想在bash脚本中调用这个matlab函数 matlab -nodesktop -nosplash -nodisplay -r "try,A=matlab_test('test','matlab'); end; quit" echo $A 我想要这个输出 test matlab hello matlab 我的要求是找到是否可以在我的bash脚本中使用Matlab的返回值,并将其传递通过管道.我只想将我的应用程序分成小组件(文件),并通过管道/参数进行通信.简而言之,我想看看我可以在我的bash脚本中包装Matlab脚本,以便我可以设置我的代码架构.
你在问两个问题.我会回答两者,包括为什么第二个可能是不可能的,这取决于你的操作系统(并且绝对不可能在我的),然后提出一个关于解决问题的解决方案的建议.
首先,当使用Matlab与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 给出输出: [XXXXXX@compute-0-138 ~]$./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 >> >> >> 所以很明显,设置环境变量的两个版本都不起作用.这使我们得到你的第二个问题. “echo”失败的原因是,系统和setenv都会在Matlab关闭时创建关闭的shell.也就是说,Matlab无法在调用它的shell外设置环境变量. 有一个解决方法为这个Windows系统讨论了in this posting,它使用的工具来自微软.也提到here. 我不相信* nix系统有一个解决方法来设置Matlab内的环境变量. 这是一种方法来做类似于你所描述的事情. 我假设使用echo不是你真正想要做的.相反,我猜想要使用存储在环境变量中的字符串输出来用于进一步使用shell中的命令或脚本.一个可能的解决办法如下: #!/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 给出输出: < M A T L A B (R) > Copyright 1984-2010 The MathWorks,visit www.mathworks.com. >> param1 : test param2 : matlab >> >> a = 0 b = hello matlab 这表示在由setenv创建的subshel??l中评估了命令echo $temp1,temp1保存分配给它的值.这个调用shell的结果现在存储在b(一个保持0表示成功).可以想象,您可以通过系统命令传递您想在shell中执行的所有操作,以便它在subshel??l中运行.我们必须了解更多关于您的问题的细节,以便对此方法进行全面的评估. 编辑和追踪********************** 最贴切的包装Matlab和bash,我可以想到的是以下的技巧.您可以将Matlab脚本的输出管理为myresult.out,其中包含以下内容: #!/bin/sh cat <<EOF | matlab -nodesktop -nosplash -nodisplay /> myresult.out A=matlab_test('$1','$2'); disp(['grepMe ' A]) exit EOF 您可以从myresult.out,管道grep gre线到sed,并且只选择所需输出行的一部分,然后在脚本的其余部分管道.这是我认为你可以达到你想要做的一样接近. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |