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

22

我一直试图从终端(我使用的是Mac)调用matlab并让它简单地运行一个程序,不显示任何内容,只运行程序。这个程序既显示图形,也为我编写一个文本文件。我找到了几个关于这个问题的先前答案,所以我尝试了:

   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

我不知道发生了什么事情。非常感谢任何帮助。


你能否尝试在你的文件(foo.m)末尾添加“exit”,并尝试使用以下命令运行Matlab:matlab -nosplash -nojvm -nodesktop -r "foo" - Nitish
无论使用-nodisplay还是不使用,都不行。 - Breaking Bioinformatics
当从Matlab GUI交互式调用脚本时,脚本是否按预期工作? - Andras Deak -- Слава Україні
1
如果一个脚本生成的图形被不存在的GUI禁用,那么它的预期行为是什么?顺便说一句,在Matlab运行时终端不响应是完全正常的,在Linux中,您可以在命令的末尾加上一个“&”来获取您的shell提示符(但杀死该终端进程可能会杀死其中运行的Matlab)。 - Andras Deak -- Слава Україні
当从GUI调用脚本时,它可以正常工作。 - Breaking Bioinformatics
4个回答

38

您的bash脚本调用Matlab时不会向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"

我建议您将matlabbash脚本放置在/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 脚本也应该是可执行的。您可以使用以下命令设置:

chmod +x script_name.sh

$ sudo chmod +x /usr/local/bin/matlab
注意:OS X El Capitan 的新功能系统完整性保护对脚本安装位置有严格限制。

创建到matlab的符号链接

另一种类似于创建bash脚本的方法是创建一个指向matlab可执行文件的符号链接。同样,应将其放置在/usr/local/bin中。

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

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

同样需要确保/usr/local/binPATH中。

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,并允许我们显示图形。因此,执行matlab而不使用完整的桌面GUI同时仍然可以显示图形的正确命令是:

$ matlab -nodesktop -nosplash

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

>> foo

或者我们可以使用matlab可执行文件的-r选项来传递命令给Matlab执行。 这些命令必须被正确引用,并且是有效的Matlab语法。 因此,启动Matlab并执行脚本foo.m的命令如下:

$ matlab -nodesktop -nosplash -r "foo"

顺带一提:如果我们使用了

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

(note the use of exit;) 这将启动Matlab,执行foo.m,显示图形,然后退出Matlab并关闭图形。

非常感谢!这让我快疯了。 (但愿现在就能授予奖励。) - Breaking Bioinformatics
是的。我需要进行大量的模型分析,而有了这个工具,速度得到了极大的提升。非常感谢你。 - Breaking Bioinformatics
我实际上需要命令行。我正在运行一个Perl脚本,用正则表达式搜索和替换MATLAB脚本中的某些变量,然后运行它,在多种不同的方式下解析数据并存储和分析它。用“烦人”一词来形容手动完成这项工作甚至都不足以形容其烦人程度。 - Breaking Bioinformatics
Matlab 2019增加了“-batch”选项,用于非交互式执行脚本、语句或函数:https://se.mathworks.com/help/matlab/ref/matlabwindows.html - Andreas

6
我认为bash脚本忽略了命令行参数。 您能尝试以下操作吗?
/Applications/MATLAB_R2015b.app/bin/matlab -nosplash -nodisplay -r "run foo.m;quit;"

1
哦,脚本很棒!如果 matlabbash别名,它可能会起作用。 - Andras Deak -- Слава Україні
出现语法错误:-bash: syntax error near unexpected token `&'。 - Breaking Bioinformatics
现在它会在命令行中拉起Matlab,但现在它显示“找不到foo.m”,即使我正在运行该行时cd到了包含foo.m的文件夹。 - Breaking Bioinformatics
警告:名称不存在或不是目录: /my/path
在路径(第109行) 在addpath(第88行) 运行错误(第70行): 找不到foo.m。
- Breaking Bioinformatics
尝试通过在命令中去除退出选项来找出根本原因,然后尝试从Matlab提示符手动运行您的脚本。 - Yuval Atzmon
显示剩余2条评论

1
这应该能起作用。
matlab -nodisplay -nodesktop -nosplash -nojvm -r "foo($v1,$v2);exit"

享受

0

你应该能够做到

#!/bin/bash
/Applications/MATLAB_R2015b.app/bin/matlab < /path/to/foo.m

换句话说,在Linux中使用"<"符号进行重定向。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接