Можно ли запустить функцию Matlab с несколькими аргументами командной строки? - PullRequest
2 голосов
/ 07 ноября 2019

Я хочу написать скрипт, который запускает несколько тестов в Matlab. Сначала я запускаю:

TestsPath=$(find . -path "Tests")

Что возвращает:

a/b/Tests/ b/c/Tests/ c/d/Tests/

Затем я пытаюсь запустить Matlab и передать их (и пока только печатать их)

matlab -nosplash -nodesktop -r "run(RunAllTests(${TestsPath}));"

И моя функция matlab выглядит следующим образом:

function [] = RunAllTests(varargin)
    for i=1:nargin
        disp(varargin{i});
    end
end  

Но это

  run(a/b/Tests
  |

Error: This statement is incomplete.

Так что кажется, что она ломается, когда дело доходит до первого пробела.

Возможно ли это сделать?

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

Если у вас нет пробелов в ваших путях, должно работать следующее:

matlab -nosplash -nodesktop -r "RunAllTests ${TestsPath}"

Используя ваш пример, это то же самое, что выполнить следующее в Matlab:

RunAllTests a/b/Tests/ b/c/Tests/ c/d/Tests/

, что приводит к varargin = {'a/b/Tests/', 'b/c/Tests/', 'c/d/Tests/'} в вашей функции. Каждый аргумент, передаваемый вашей функции таким образом, обрабатывается как массив символов.

1 голос
/ 08 ноября 2019

Вы можете убедиться, что имена файлов заключены в кавычки, используя действие -printf для find:

TestsPath=$(find . -path "Tests" -printf "'%p' ")

. Это вернет

'a/b/Tests/' 'b/c/Tests/' 'c/d/Tests/' 

, что нормально дляподставьте в синтаксис команды MATLAB синтаксис вызов функции, как предложено Alex :

matlab -nosplash -nodesktop -r "RunAllTests ${TestsPath};"

Обратите внимание, что эти кавычки необходимы, если в именах каталогов есть пробелы.


Обратите внимание, что после MATLAB R2019b -r устарела в пользу новой опции командной строки -batch:

matlab -batch "RunAllTests ${TestsPath};"

Это работает одинаково на всех платформах (включая Windows!).

1 голос
/ 07 ноября 2019

Да, вам нужны запятые между аргументами функции, заключите их в одинарные кавычки, чтобы matlab воспринимал их как строки, а запуск не требуется.

TestsPath="'a/b/Tests/', 'b/c/Tests/', 'c/d/Tests/'"
matlab -nosplash -nodesktop -r "RunAllTests(${TestsPath})"

Если вы не хотите добавлять запятые междуаргументы, вы можете передать TestsPath как одну строку и разбить ее на несколько аргументов в Matlab.

TestsPath="'a/b/Tests/ b/c/Tests/ c/d/Tests/'"
matlab -nosplash -nodesktop -r "RunAllTests(strsplit(${TestsPath}))"
...