你问了两个问题。我会回答这两个问题,包括为什么第二个可能取决于您的操作系统(在我的操作系统上绝对不可能),然后提供有关问题相关解决方法的建议。
首先,当让 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
>> >> >>
很明显,设置环境变量的两个版本都不起作用。这就引出了你的第二个问题。
“回显”失败的原因是两者都system
创建setenv
了在 Matlab 关闭时关闭的外壳。也就是说,Matlab 不能在调用它的 shell 之外设置环境变量。
对于这篇文章中讨论的 Windows 系统,有一个解决方法,它使用 Microsoft 的工具。这里也提到了。
我不相信 *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 test matlab 警告:未找到窗口系统。Java 选项“MWT”被忽略
< 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
这表明该命令echo $temp1
在由创建的子 shell 中进行了评估,setenv
并且 temp1 保存了分配给它的值。这个对 shell 的调用的结果现在存储在 b 中(a 保持 0 表示成功)。可以想象,您可以通过 system 命令传递您想要在 shell 中执行的全部操作,以便它在子 shell 中运行。不过,我们必须了解您的问题的更多细节才能对这种方法进行全面评估。
编辑和跟进 **********************
我能想到的最接近包装 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
您可以从 grepgrepMe
行myresult.out
,管道到 sed,并仅选择您需要的输出行的一部分,然后在脚本的其余部分上管道。这与我认为您可以实现的目标一样接近。