Что-то пропало в терминале linux после запуска matlab из командной строки
У меня странное поведение при запуске Matlab из командной строки в Linux.
У меня есть скрипт bash в Linux, который выполняет функцию в Matlab из командной строки и выполняет другие операции с пользовательскими функциями, написанными на C++, следующим образом:
#!/bin/bash
# prepare input data just to be sure it has not been written by other test!
matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'A' ); quit"
# launch C++ program
...
# prepare more data
matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'B' ); quit"
Когда скрипт закончен, я не вижу, что я пишу в терминале, хотя команды имеют эффекты. Мне необходимо reset
терминал.
Дело в том, что все работает нормально, если я только запускаю Matlab с prepare_data_matlab( 'A' )
но проблема возникает, когда я выполняю функцию с опцией prepare_data_matlab( 'B' )
,
Я прокомментировал построчно и обнаружил, что проблема с опцией B
которые вызывают функцию
dlmwrite(file_name, B, ' ');
который не используется в prepare_data_matlab( 'A' )
,
Итак, как мне выполнить Matlab из командной строки, чтобы избежать этого поведения? Есть ли известная ошибка с dlmwrite()
функционировать?
Я использую Ubuntu 12.04 64 бит, GNU bash, версия 4.2.24(1)-релиз (x86_64-pc-linux-gnu) и matlab2011a.
РЕДАКТИРОВАНИЕ: вывод, созданный для prepare_data_matlab( 'A' )
является
Выходные данные, созданные для prepare_data_matlab( 'B' )
является
Редакция: file_name
создан как strcat(path_to_data,f);
где path_to_data = /tmp/
а также f = data_out.txt
, матрица B
не отображается до или после.
Единственный вывод в терминал до или после сценария MATLAB генерируется из сценария bash следующим образом:
echo "#### SELECT DATA FROM WORKSPACE ####"
matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'B' ); quit";
echo "#### Process Data as input in a C++ programs ####"
Функция MATLAB выбирает данные из рабочей среды и сохраняет их на диск следующим образом:
function [ ] = prepare_data_matlab( type )
if strcmp(type,'A')
% load data from workscape
load ('workspace_with_my_arrays.mat', 'A');
% save data as a standalone variable
save('/tmp/A.mat', 'A');
elseif strcmp(type,'B')
% load data from workscape
load ('workspace_with_my_arrays.mat', 'B');
path_to_data = '/tmp/';
f = 'data_out.txt';
file_name = strcat(path_to_data,f);
% save data as a txt file
dlmwrite(file_name, B, ' ');
end
end
РЕДАКТИРОВАНИЕ: whos -file workspace_with_my_arrays.mat
Name Size Bytes Class Attributes
A 610x340x103 170897600 double
B 610x340x103 170897600 double
P 610x340 1659200 double
t1 38855x100 31084000 double
t2 3921x2x100 6273600 double
В рабочей области больше массивов, но я загружаю их.
prepare_data_matlab
Функция такая же, как опубликованная выше, но с проверкой ошибок аргумента следующим образом:
%% Load data from file
% Data is saved in a MATLAB variable or in TXT
if nargin ~= 1
error('Use: prepare_data_matlab( [ A | B ] )')
end
и следующая команда:
cd /data/matlab;
который выполняется после проверки ошибок аргументов в обоих случаях (опция A
и вариант B
), то есть до if
заявление.
2 ответа
Проблема не с dlmwrite
, Это, как представляется, ошибка в некоторых версиях MATLAB, как сообщается в этой ссылке.
Предлагаемое решение (если у вас глючная версия MATLAB) заключается в использовании nohup
:
nohup matlab -nodesktop -nosplash -r ...........
ОБНОВЛЕНИЕ: Согласно предложению @Amro, @pQB сообщил о проблеме в службу поддержки MathWorks. Их ответ был:
Эта проблема известна в версиях до R2012a. Запустите MATLAB под другой оболочкой. Например, ни tcsh, ни zsh не имеют этой проблемы.
СТАРЫЙ ответ: проблема не с dlmwrite
, но с содержанием вашей матрицы. Кроме того, если file_name
указывает на stdout
(например, file_name='/dev/stdout';
), dlmwrite
Функция не будет ничего записывать на экран и не будет портить ваш терминал. Или file_name
указывает на stdout
или вы отображаете матрицу B непосредственно перед (или после) dlmwrite
вызов.
В любом случае проблема заключается в содержимом вашей матрицы B (см. Странные символы в выходных данных). Вам нужно исправить проблему с вашей матрицей B. Возможно, метод, который вы используете для чтения входных данных, неисправен.
Если вы хотите игнорировать вывод из MATLAB (например, баннер, напечатанный в начале), запустите процесс и перенаправьте стандартный ввод и ошибку на /dev/null
устройство:
#!/bin/sh
echo '### running MATLAB ###'
matlab -nodesktop -nosplash -r "..." > /dev/null 2>&1
echo '### done ###'
./other_script.sh
matlab -nodesktop -nosplash -r "..." > /dev/null 2>&1
Обратите внимание, что вы должны быть осторожны, поскольку процесс MATLAB возвращается немедленно, возможно, до его завершения, что может вызвать проблемы, если ваша следующая программа зависит от файлов, созданных MATLAB. Смотрите здесь для возможного решения.