web-dev-qa-db-fra.com

Comment appeler le script MATLAB en ligne de commande?

J'ai essayé d'appeler Matlab à partir de Terminal (j'ai un Mac) et de le faire exécuter simplement un programme pour moi, sans affichage ni rien, uniquement le programme. Ce programme affiche des graphiques et écrit un fichier texte que je peux utiliser. J'ai trouvé plusieurs réponses précédentes à cette question et j'ai donc essayé:

   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

À peu près à chaque fois que j'essaye, je continue à avoir la même réponse (quand la ligne ne provoque pas simplement l'invite à dire "va te faire foutre" et abandonne): le programme MATLAB actuel window restera ouvert. Il va interagir normalement. Et la ligne de commande ne fera rien tant que je n'aurai pas fermé la fenêtre. Le programme que je veux ne fonctionne pas. La fenêtre est juste… assise. 

Si cela peut aider, voici comment j'ai matlab codé dans ma corbeille:

#!/bin/bash                                                                                             

/Applications/MATLAB_R2015b.app/bin/matlab

Je n'ai aucune idée de ce qui se passe. Toute aide serait grandement appréciée.

16

Votre script bash pour appeler Matlab ne transmettra aucun argument à l'exécutable Matlab. Quand vous tapez

$ matlab -nodesktop -nosplash -r "foo"

ce qui s'appelle réellement est

$ /Applications/MATLAB_R2015b.app/bin/matlab

sans les arguments. Il existe plusieurs façons de résoudre ce problème tout en conservant la facilité d'appeler simplement matlab. Sinon, vous pouvez appeler le chemin complet vers matlab comme

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

Configurer matlab Exécutable

Script Bash

Etant donné que vous avez déjà écrit un script bash pour appeler matlab, la solution la plus simple consiste à le modifier pour inclure le caractère générique $@bash comme

#!/bin/bash                                                                                             

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

Le caractère générique $@ transmet tous les paramètres que vous utilisez, tels que -nodesktop -nosplash -r "foo" à l'exécutable matlab.

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

Je vous recommande de placer votre script matlabbash dans /usr/local/bin et de vous assurer que /usr/local/bin est dans votre PATH. Le répertoire /usr/local/ est destiné aux scripts installés par l'utilisateur, par opposition aux scripts installés par le système. Vous pouvez vérifier quels répertoires sont dans votre PATH avec

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin

et vous devriez voir une sortie similaire à celle ci-dessus avec /usr/local/bin présent. Le script bash devrait également être exécutable. Vous pouvez définir cela avec

$ Sudo chmod +x /usr/local/bin/matlab

Remarque: OS X El Capitan impose des restrictions strictes sur l'emplacement d'installation des scripts via sa nouvelle fonctionnalité Protection de l'intégrité du système .

Création d'un lien symbolique vers matlab

Une autre méthode similaire à la création du script bash consiste à créer un lien symbolique vers l'exécutable matlab. Ceci encore devrait être placé dans /usr/local/bin

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

Pour cette méthode également, vous devez vous assurer que /usr/local/bin est dans votre PATH.

Ajout de matlab à la PATH

Une autre méthode consiste simplement à ajouter le répertoire où l'exécutable matlab réside à votre PATH. Vous pouvez le faire en modifiant votre fichier .bash_profile (ou .bashrc). Votre fichier .bash_profile se trouve dans votre répertoire personnel à ~/.bash_profile. Il est exécuté chaque fois que votre utilisateur ouvre le terminal. Pour ajouter matlab à la PATH, ajoutez simplement

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

à cela. Maintenant, vous pouvez appeler matlab avec 

$ matlab -nodesktop -nosplash -r "foo"

et cela localisera l'exécutable matlab dans /Applications/MATLAB_R2015b.app/bin/ et l'appellera avec

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

Après avoir modifié votre fichier .bash_profile, vous devez le recharger avec

$ source ~/.bash_profile

ou redémarrez le terminal pour que les modifications prennent effet.

Note: Je préfère modifier le fichier .bashrc au lieu de .bash_profile car j'utilise aussi .bashrc sous Linux. J'ai configuré mon fichier .bash_profile pour charger mon fichier .bashrc

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

Note: Si vous voulez que matlab soit disponible pour chaque utilisateur et pas seulement pour vous, vous devez ajouter

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

dans le fichier /etc/profile du système.

Création d'un alias pour matlab

La dernière méthode que je vais mentionner est la création d'un alias pour matlab. Nous le faisons en modifiant à nouveau notre fichier .bash_profile (ou .bashrc) et en ajoutant

alias matlab="/Applications/MATLAB_R2015b.app/bin/matlab"

à cela. Encore une fois, après avoir apporté des modifications, nous devons le recharger avec 

$ source ~/.bash_profile

ou redémarrez le terminal pour que les modifications prennent effet. Et si vous souhaitez que matlab soit disponible pour tous les utilisateurs, et pas seulement pour vous, vous devez modifier le fichier /etc/profile à l’échelle du système.

Exécution de matlab à partir du terminal

Maintenant que nous avons configuré matlab pour exécuter facilement à partir du terminal avec la simple commande

$ matlab

nous pouvons regarder en train d'exécuter des scripts. Pour exécuter un script Matlab, nous devons d’abord se trouver dans le répertoire dans lequel il se trouve ou dans notre répertoire Matlab PATH. Je suppose que ce n'est pas dans votre chemin et nous allons donc cd dans le bon répertoire

$ cd /path/to/foo.m

Maintenant, pour exécuter matlab sans le bureau MathWorks nous dit d’utiliser -nojvm -nodisplay -nosplash, mais si nous utilisons -nojvm et/ou -nodisplay, nous ne pourrons pas afficher de graphiques. Nous abandonnons donc -nojvm et remplaçons -nodisplay par -nodesktop et utilisons -nodesktop -nosplash. Cela lancera Matlab sans affichage et nous permettra d’afficher des graphiques. La commande correcte puis exécuter matlab sans l'interface graphique complète du bureau tout en nous permettant également d'afficher des graphiques est

$ matlab -nodesktop -nosplash

Vous pouvez maintenant utiliser le terminal (invite de commande) comme fenêtre de commande Matlab et exécuter les commandes normalement. Par exemple, nous pourrions appeler foo

>> foo

Alternativement, nous pouvons utiliser l'option -r pour que l'exécutable matlab puisse transmettre des commandes à exécuter par Matlab. Celles-ci doivent être citées correctement et valider la syntaxe Matlab. Donc, notre commande pour démarrer Matlab avec nos options précédentes et pour exécuter le script foo.m devient

$ matlab -nodesktop -nosplash -r "foo"

Aside: Si, par exemple, nous devions utiliser

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

(notez l'utilisation de exit;) ceci démarrerait Matlab, exécuterait foo.m, afficherait les graphiques, puis quitterait Matlab en fermant aussi les graphiques. 

27
IKavanagh

Je pense que le script bash ignore les arguments de la ligne de commande . Pouvez-vous essayer ce qui suit? 

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

Cela devrait faire l'affaire 

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

prendre plaisir 

1
eyalsoreq

Vous devriez pouvoir faire 

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

en d'autres termes, utilisez le signe < pour rediriger, sous Linux.

0
alle_meije