我一直试图从终端调用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
我不知道发生了什么事。任何帮助将不胜感激。
答案 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
脚本来呼叫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/bin
。 bash
脚本也应该是可执行的。您可以使用
$ 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中使用<
符号重定向。