For some time now, I have often wondered why MATLAB highlighted text starting with a !
in a different colour. I thought nothing of it until recently when I was, as always, randomly entering code into MATLAB and had accidentally put a exclamation mark in the command window (I can't remember the exact reason why I was using exclamation marks). The result was quite interesting: it sent the command to the command interpreter outside of MATLAB which, of course, flagged this as an error. In seeing this, I stopped what I was doing and started to play about with this newly discovered shortcut.
My first command was !bash
which, being in Linux, should run the BASH shell... which it did. I could then use MATLAB as a glorified terminal window. Whilst in BASH, I decided to check for updates for the machine which would require me to use sudo
followed by the update command (and as I use Ubuntu, that's simply turns out to be sudo apt-get update
). As always (with the exception of doing this in MATLAB), I was prompted for my password. Interestingly, MATLAB behaved like the terminal window and didn't display my password which normally happens should one Telnet their POP3 server (a hobby of mine). I guess this would be due to a so-called seamless "pipe" between MATLAB and, in this case, BASH.
From here, one can then go a step further an build m-files that run external commands. Of course, there's the issue of platform dependency here (mainly for the UNIX group) but one can work around this issue. A nice feature (at least in the UNIX version) is the fact that !
commands run in the current working directory (try !pwd
and await a response) which means navigation isn't a problem. One minor niggle that I haven't been able to resolve just yet is trying to take a result from the external command without resulting to taking output manually using the command > output.log
method.
So let's create something that works out what platform we're running on from within MATLAB and obtains the flavour of Linux using Linux command uname
if isunix
% In Unix, determine OS type
!uname -s > unixname.txt
% Now read this file:
fid = fopen(unixname.txt, 'rt');
if feof(fid) == 0 % Determine if at end of file
osname = fgetl(fid); % Get line
else
disp('File ended early');
end
elseif ispc
disp('I''m in MS Windows');
else
disp('Impossible: You''re not running either Windows or UNIX?');
end
Hopefully you are able to see the potential here in executing external applications based on what operating system environment is currently being used. Both Windows and UNIX support the command > output.log
method (which you may remember from the Queue system). In fact, I frequently create script files using a combination of echo
and the "append" verb >>
where I can get away with it.
Read more on this article...