18

如果您在 foo.m 中有 Mathematica 代码,则可以使用-noprompt-initfile foo.m (or -run "<<foo.m") 调用 Mathematica,并且可以使用命令行参数$CommandLine(其中包含额外的垃圾),但是有没有办法只使用一些 mathematica 代码,例如

#!/usr/bin/env MathKernel
x = 2+2;
Print[x];
Print["There were ", Length[ARGV], " args passed in on the command line."];
linesFromStdin = readList[];
etc.

和 chmod 它可执行并运行它?换句话说,如何像使用任何其他脚本语言(Perl、Python、Ruby 等)一样使用 Mathematica?

4

6 回答 6

11

MASH -- Mathematica Scripting Hack -- 会做到这一点。

从 Mathematica 版本 6 开始,以下 perl 脚本就足够了:

http://ai.eecs.umich.edu/people/dreeves/mash/mash.pl

对于以前的 Mathematica 版本,需要一个 C 程序:

http://ai.eecs.umich.edu/people/dreeves/mash/pre6

更新:终于,Mathematica 8 通过“-script”命令行选项原生支持这一点:

http://www.wolfram.com/mathematica/new-in-8/mathematica-shell-scripts/

于 2008-09-30T03:29:27.867 回答
6

这是一个不需要额外帮助脚本的解决方案。您可以使用以下 shebang 直接调用 Mathematica 内核:

#!/bin/sh
exec <"$0" || exit; read; read; exec /usr/local/bin/math -noprompt "$@" | sed '/^$/d'; exit
(* Mathematica code starts here *)
x = 2+2;
Print[x];

shebang 代码跳过脚本的前两行,并将其余部分作为标准输入提供给 Mathematica 内核。sed命令删除内核产生的空行。

这种 hack 不如MASH通用。因为 Mathematica 代码是从标准输入读取的,所以您不能将标准输入用于用户输入,即InputInputString函数不起作用。

于 2010-08-14T19:48:05.003 回答
5

假设您将 Mathematica 二进制文件添加到 ~/.profile 中的 PATH 环境变量中,

export PATH=$PATH:/Applications/Mathematica.app/Contents/MacOS

然后,您只需在 Mathematica 脚本中编写此 shebang 行。

#!/usr/bin/env MathKernel -script

现在你可以点斜线你的脚本。

$ cat hello.ma
#!/usr/bin/env MathKernel -script

Print["Hello World!"]

$ chmod a+x hello.ma
$ ./hello.ma
"Hello World!"

使用 Mathematica 8.0 测试。

小错误:Mathematica 在 Windows 和 Mac OS X 中用引号包围 Print[s],但在 Linux 中没有。怎么回事?

于 2011-11-01T20:32:43.407 回答
4

尝试
-initfile filename
并将退出命令放入您的程序中

于 2008-09-29T09:26:02.637 回答
2

我找到了另一个对我有用的解决方案。

将代码保存在 .m 文件中,然后像这样运行它: MathKernel -noprompt -run “<

这是链接:http ://bergmanlab.smith.man.ac.uk/?p=38

于 2012-06-24T12:01:31.827 回答
1

对于数学 7

$ cat test.m
#!/bin/bash
MathKernel -noprompt -run < <( cat $0| sed -e '1,4d' )  | sed '1d'
exit 0
### code start Here ... ###
Print["Hello World!"]
X=7
X*5

用法:

$ chmod +x test.m

$ ./test.m
"Hello World!"

7
35
于 2013-02-16T07:06:39.547 回答