function [result] = matlab_test(param1,param2) disp(sprintf('param1 : %s',param1)); disp(sprintf('param2 : %s',param2)); result = 'hello 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的返回值的部分和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
给出输出:
[XXXXXX @ compute-0-138〜] $./stack_ex_3测试matlab
警告:找不到窗口系统.忽略Java选项’MWT’
< 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创建的subshell中评估了命令echo $temp1,temp1保存分配给它的值.这个调用shell的结果现在存储在b(一个保持0表示成功).可以想象,您可以通过系统命令传递您想在shell中执行的所有操作,以便它在subshell中运行.我们必须了解更多关于您的问题的细节,以便对此方法进行全面的评估.
编辑和追踪**********************
最贴切的包装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,并且只选择所需输出行的一部分,然后在脚本的其余部分管道.这是我认为你可以达到你想要做的一样接近.