Executing unix commands set in PATH in matlab does not work with unix command
32 次查看(过去 30 天)
显示 更早的评论
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 个评论
Walter Roberson
2012-2-1
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) ?
回答(5 个)
Walter Roberson
2012-3-12
PATH = getenv('PATH');
setenv('PATH', [PATH ':/usr/local/desiredpath']);
unix('commandofinterest')
3 个评论
Miriam
2019-5-30
编辑:Walter Roberson
2019-5-30
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 个评论
Ken Atwell
2012-2-2
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 个评论
Matthias Fripp
2017-10-8
@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
2017-10-8
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
2014-2-3
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 个评论
Walter Roberson
2014-2-3
You have likely defined a variable named "unix", or else have defined your own function named "unix". Check with
which -all unix
Carmine
2014-2-4
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 个评论
Walter Roberson
2014-2-4
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
2014-2-5
No, that doesn't work either (it gives no output at all).
>>!pwd
>>
And I am not using tset anywhere.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Environment and Settings 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!