Executing unix commands set in PATH in matlab does not work with unix command
23 views (last 30 days)
Show older comments
Greetings,
When running the "unix" command in matlab, i.e.: unix('<unix_command>') I get an error, the unix command is not found in /bin/bash. Interestingly, other commands work with the unix command, e.g.: unix('who'). Also of note, running "echo $SHELL" in the terminal window returns "/bin/bash". The command I am trying to run is part of a package that is set in my PATH.
Any help you might offer would be greatly appreciated-
1 Comment
Walter Roberson
on 1 Feb 2012
What is shown if you
unix('echo $PATH')
And does it match the PATH that was set before you started MATLAB? (except that starting MATLAB probably added MATLAB directories to the PATH) ?
Answers (5)
Walter Roberson
on 12 Mar 2012
PATH = getenv('PATH');
setenv('PATH', [PATH ':/usr/local/desiredpath']);
unix('commandofinterest')
3 Comments
Miriam
on 30 May 2019
Edited: Walter Roberson
on 30 May 2019
Hi,
Following up on this, I encounter a similar problem for unix commands (Ubuntu, Win 10).
I can call basic unix functions from Matlab directly (for example !ubuntu -c ls) but I can’t access a specific program (which lives in /home/myname/abin) or any of its functions which I would like to run from Matlab.
When I set the path to access the directory of this program in Matlab using setenv, the path is indeed set correctly. But whatever function I am trying to run, with using !myfunction or unix(myfunction) or !ubuntu myfunction, I get the error “myfunction is not recognized as an internal or external command, operable program or batch file.“ (or similar for the other calls).
I think this might be related with Windows being blind for Ubuntu directories or not having permission to access them but even setting the path directly to Ubuntu files stored in Windows (as decribed here: https://www.howtogeek.com/261383/how-to-access-your-ubuntu-bash-files-in-windows-and-your-windows-system-drive-in-bash/ ) does not do the job.
Before I reinstall Matlab in Ubuntu only to be able to access this program, does anyone know how to solve this problem?
0 Comments
Ken Atwell
on 2 Feb 2012
MATLAB does not source your BASH shell resource file, so anything established in that file may not be available to the unix command.
First check your PATH as Walter recommend, and if it is not to your liking, you can use setenv to include the directories you need.
5 Comments
Matthias Fripp
on 8 Oct 2017
@Walter Roberson, the setenv command is a Matlab command; it should be run directly on the Matlab command line, not via system() or unix(). When run from within Matlab, it modifies the environment within which Matlab is running, and that affects all subsequent unix() or system() calls.
Walter Roberson
on 8 Oct 2017
Matthew had used
unix('setenv PATH "/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/desiredpath"')
which is only valid syntax for csh derivatives. Setting the environment from within the command to be unix()'d is a valid approach, but these days typically involves an "export" command.
Carmine
on 3 Feb 2014
Hello, I'm still getting the same error:
unix('ls')
gives
ans=127
even though I've added /bin to the path. Calling unix('/bin/ls') also gives 127. Any possible other solutions?
1 Comment
Walter Roberson
on 3 Feb 2014
You have likely defined a variable named "unix", or else have defined your own function named "unix". Check with
which -all unix
Carmine
on 4 Feb 2014
Thanks for you comment, Walter. No, I get the following:
>> which -all unix
built-in (/usr/local/common/matlab_2013b/toolbox/matlab/general/unix)
Also, if I try system('pwd'), I get 127.
If I run Matlab on another machine, the commands work fine. Somewhere, there is a difference between the two machines, or my environment setup. I am wondering where I should look to find that difference. getenv('LD_LIBRARY_PATH') give the same paths on both machines.
2 Comments
Walter Roberson
on 4 Feb 2014
How about
!pwd
?
My guess: you have configured your shell to source a file each time a shell is started, but the commands inside it rely upon being sourced from a shell that has terminal access. Shells started with unix() or system() do not have an associated terminal.
The file being sourced that I am referring to is probably not /etc/profile or ~/.bash_profile or ~/.bash_login or ~/.profile as those are the ones checked for interactive login, which would not be the case in this situation. However, ~/.bashrc would be used for interactive non-login shells, and for any shell the environment variable BASE_ENV is checked and if it refers to a file then the file is sourced. But if the shell was invoked as "sh" instead of as "bash" then some of the above files are skipped and the environment variable examined is ENV instead of BASE_ENV
The most common startup command that causes problems is "tset" to try to query the user to set the terminal type, especially in the form
eval `tset -s -m ... `
Such a command needs to be protected by testing to see if a terminal is defined, such as by using
[[ -t 0 ]] && eval `tset -s -m ... `
which checks that file descriptor 0 (stdin) is associated with a terminal before it goes ahead with the tset.
Carmine
on 5 Feb 2014
No, that doesn't work either (it gives no output at all).
>>!pwd
>>
And I am not using tset anywhere.
See Also
Categories
Find more on File Operations in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!