如何从命令行调用MATLAB脚本?

时间:2015-10-17 13:23:31

标签: bash matlab

我一直试图从终端调用matlab(我有一台Mac)并让它为我运行一个程序,没有显示或任何东西,只是程序。该程序显示图形并写入文本文件供我使用。我已经在这个问题上找到了几个先前的答案,所以我尝试过:

   matlab -nodisplay -r foo 

   matlab -nodisplay -r foo.m 

   matlab -nojvm -nosplash -nodisplay -r foo;quit; 

   matlab -nojvm -nosplash -nodisplay -r "foo;quit;" 

   matlab -nojvm -nodesktop -r "foo;quit;" 

   matlab -nojvm -nodesktop -r
   "foo" 

   matlab -nojvm -nodesktop -nosplash -r foo

几乎每次尝试时,我都会得到相同的响应(当线路没有引起提示时说出"搞砸了你"并放弃):实际的MATLAB程序窗口将会打开,并且会保持打开状态。它会正常交互。在我关闭窗口之前,命令行不会做任何事情。我想要的程序没有运行。窗户......坐在那里。

如果有帮助,这就是我在我的bin中编码matlab的方式:

#!/bin/bash                                                                                             

/Applications/MATLAB_R2015b.app/bin/matlab

我不知道发生了什么事。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:28)

用于调用Matlab的bash脚本不会将任何参数传递给Matlab可执行文件。当您键入

$ matlab -nodesktop -nosplash -r "foo"

实际上所谓的是

$ /Applications/MATLAB_R2015b.app/bin/matlab

没有参数。有几种方法可以解决这个问题,同时保留了调用matlab的便利性。或者,您可以调用matlab的完整路径

$ /Applications/MATLAB_R2015b.app/bin/matlab -nodesktop -nosplash -r "foo"

设置matlab可执行文件

Bash脚本

鉴于您已编写bash脚本来呼叫matlab,最简单的解决方案是将其更改为包含$@ bash通配符,如

#!/bin/bash                                                                                             

/Applications/MATLAB_R2015b.app/bin/matlab "$@"

$@通配符会将您使用的所有参数(例如-nodesktop -nosplash -r "foo")传递给matlab可执行文件,因此现在实际调用的是

$ /Applications/MATLAB_R2015b.app/bin/matlab -nodesktop -nosplash -r "foo"

我建议您将matlab bash脚本放在/usr/local/bin中,并确保/usr/local/bin位于PATH/usr/local/目录用于用户安装的脚本,而不是系统安装的脚本。您可以使用

查看PATH中的目录
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin

您应该会看到与上面类似的输出,并显示/usr/local/binbash脚本也应该是可执行的。您可以使用

进行设置
$ sudo chmod +x /usr/local/bin/matlab

注意:OS X El Capitan对通过其新System Integrity Protection功能安装脚本的位置施加了强烈限制。

创建符号链接到matlab

与创建bash脚本类似的另一种方法是创建指向matlab可执行文件的符号链接。这应该再次放在/usr/local/bin

$ cd /usr/local/bin/
$ ln -s /Applications/MATLAB_R2015b.app/bin/matlab matlab

同样,对于此方法,您需要确保/usr/local/bin中有PATH

matlab添加到PATH

另一种方法是简单地将matlab可执行文件所在的目录添加到PATH。您可以通过修改.bash_profile(或.bashrc)文件来执行此操作。您的.bash_profile文件位于~/.bash_profile的主目录中。每次用户打开终端时都会执行该操作。要将matlab添加到PATH,只需附加

即可
export PATH=$PATH:/Applications/MATLAB_R2015b.app/bin/

到它。现在,您可以使用

致电matlab
$ matlab -nodesktop -nosplash -r "foo"

这将在matlab中找到/Applications/MATLAB_R2015b.app/bin/可执行文件,并使用

进行调用
$ /Applications/MATLAB_R2015b.app/bin/matlab -nodesktop -nosplash -r "foo"

修改.bash_profile文件后,需要使用

重新加载
$ source ~/.bash_profile

或重新启动终端以使更改生效。

注意:我更喜欢修改.bashrc文件而不是.bash_profile,因为我在Linux上也使用.bashrc。我已将.bash_profile文件设置为加载我的.bashrc文件

$ cat .bash_profile 
# Load .bashrc if it exists
test -f ~/.bashrc && source ~/.bashrc

注意:如果您希望matlab适用于每个用户而不仅仅是您的用户,则需要添加

export PATH=$PATH:/Applications/MATLAB_R2015b.app/bin/

到系统范围的/etc/profile文件。

matlab

创建别名

我要提到的最后一个方法是为matlab创建一个别名。我们通过再次修改.bash_profile(或.bashrc)文件并附加

来完成此操作
alias matlab="/Applications/MATLAB_R2015b.app/bin/matlab"

到它。再次,在进行更改后,我们需要使用

重新加载它
$ source ~/.bash_profile

或重新启动终端以使更改生效。而且,如果您希望matlab可供每个用户使用,而不仅仅是您的用户,则需要修改系统范围的/etc/profile文件。

从终端

执行matlab

现在我们已经设置matlab以便使用简单命令

从终端方便地执行
$ matlab

我们可以看看实际执行脚本。要执行Matlab脚本,我们首先需要在脚本所在的目录中,或者它可以在我们的Matlab PATH中。我假设它不在您的路径中,因此我们cd到正确的目录

$ cd /path/to/foo.m

现在在没有桌面的情况下执行matlab MathWorks告诉我们使用-nojvm -nodisplay -nosplash,但如果我们使用-nojvm和/或-nodisplay,我们将无法显示图表。因此,我们放弃-nojvm并将-nodisplay替换为-nodesktop并使用-nodesktop -nosplash。这将启动没有显示器的Matlab,并允许我们显示图形。然后在没有完整桌面GUI的情况下执行matlab同时允许我们显示图形的正确命令是

$ matlab -nodesktop -nosplash

现在您可以使用终端(命令提示符)作为Matlab命令窗口并正常执行命令。例如,我们可以调用foo

>> foo

或者,我们可以使用-r可执行文件的matlab选项传递Matlab执行的命令。 必须正确引用这些内容并使用有效的Matlab语法。因此,我们使用以前的选项启动Matlab并执行脚本foo.m的命令变为

$ matlab -nodesktop -nosplash -r "foo"

除了:例如,如果我们使用

$ matlab -nodesktop -nosplash -r "foo; exit;"

(注意使用exit;)这将启动Matlab,执行foo.m,显示图形,然后退出Matlab关闭图形。

答案 1 :(得分:3)

我认为bash脚本会忽略命令行参数。 你可以试试以下吗?

/Applications/MATLAB_R2015b.app/bin/matlab -nosplash -nodisplay -r "run foo.m;quit;"

答案 2 :(得分:1)

这应该可以解决问题

matlab -nodisplay -nodesktop -nosplash -nojvm -r "foo($v1,$v2);exit"

享受

答案 3 :(得分:0)

你应该能够做到

#!/bin/bash
/Applications/MATLAB_R2015b.app/bin/matlab < /path/to/foo.m
换句话说,在Linux中使用<符号重定向。