Вызвать программу Mathematica из командной строки, с командами командной строки, stdin, stdout и stderr
Если у вас есть код Mathematica в foo.m, Mathematica можно вызвать с помощью -noprompt
и с -initfile foo.m
(или -run "<<foo.m"
)
и аргументы командной строки доступны в $CommandLine
(с добавлением лишнего мусора), но есть ли способ иметь некоторый математический код, например
#!/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 это исполняемый файл и запустить его? Другими словами, как использовать Mathematica, как и любой другой язык сценариев (Perl, Python, Ruby и т.д.)?
Ответы
Ответ 1
MASH - Mathematica Scripting Hack - сделает это.
Так как Mathematica версии 6, достаточно следующего perl script:
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/
Ответ 2
Вот решение, которое не требует дополнительного помощника script. Вы можете использовать следующий shebang для прямого вызова ядра Mathematica:
#!/bin/sh
exec <"$0" || exit; read; read; exec /usr/local/bin/math -noprompt "[email protected]" | sed '/^$/d'; exit
(* Mathematica code starts here *)
x = 2+2;
Print[x];
Код shebang пропускает первые две строки script и передает остальные в ядро Mathematica в качестве стандартного ввода. Команда sed выводит пустые строки, созданные ядром.
Этот хак не так универсален, как MASH. Поскольку код Mathematica считывается из stdin, вы не можете использовать stdin для ввода пользователем, то есть функции Input и InputString не работают.
Ответ 3
Попробуйте
-initfile имя файла
И поместите команду exit в свою программу
Ответ 4
Предполагая, что вы добавляете двоичные файлы Mathematica к переменной среды PATH в файле ~/.profile,
export PATH=$PATH:/Applications/Mathematica.app/Contents/MacOS
Затем вы просто напишите эту строку shebang в своих сценариях Mathematica.
#!/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 окружает печать [s] кавычками в Windows и Mac OS X, но не Linux. WTF?
Ответ 5
Я нашел другое решение, которое сработало для меня.
Сохраните код в файле .m, затем выполните его следующим образом: MathKernel -noprompt -run "<
Это ссылка: http://bergmanlab.smith.man.ac.uk/?p=38
Ответ 6
Для математики 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