Perplexing output from the system() command

6 visualizaciones (últimos 30 días)
the cyclist
the cyclist el 19 de En. de 2017
Comentada: Jess Crawshaw el 28 de Abr. de 2020
I am running R2106b on a Macbook Pro OS X Yosemite.
In a Terminal window (using bash shell), if I type
which which
I get the expected output
/usr/bin/which
and similarly
which psql
yields
/usr/local/bin/psql
All is well and good so far. But if I issue these same command from within MATLAB, using the system() command, I get output that perplexes me. As expected, when I type
[status cmdout] = system('which which')
I get
status =
0
cmdout =
'/usr/bin/which
'
But from
[status cmdout] = system('which psql')
I get
status =
1
cmdout =
0×0 empty char array
Finally, if I point directly to the known directory (which in my real application I would not know) ...
[status cmdout] = system('which /usr/local/bin/psql')
then the command is found
status =
0
cmdout =
'/usr/local/bin/psql
'
Does anyone have some insight into what is happening here? I am not a Unix expert by any means. But the whole thing seems to be a bit of a shell game. ;-)
(I can add the why I am doing this if needed, but I won't burden folks just yet.)
  3 comentarios
Walter Roberson
Walter Roberson el 23 de Jun. de 2017
The causes are described below: when you start MATLAB from the icon, that is not a login shell so your shell setup files are not run and so your PATH environment variable does not include everything you might be expecting.
Jess Crawshaw
Jess Crawshaw el 28 de Abr. de 2020
Your answer below completely fixed my problems, thanks for this

Iniciar sesión para comentar.

Respuesta aceptada

Walter Roberson
Walter Roberson el 25 de En. de 2017
psql is not on your PATH environment variable inside of MATLAB. When you enter the terminal then that would be a login shell and your bash profile would be executed, but when you start MATLAB from an icon then that is not a login shell and your bash profile would not be executed.
  2 comentarios
the cyclist
the cyclist el 25 de En. de 2017
Editada: the cyclist el 25 de En. de 2017
Thanks.
For the sake of others who may read this ...
The specific solution for me was to add /usr/local/bin to my MATLAB PATH environment variable. I did this by adding the line
setenv('PATH', [getenv('PATH') ':/usr/local/bin'])
to my startup file.
Walter Roberson
Walter Roberson el 10 de Sept. de 2017
/etc/profile and ~/.bashrc and ~/.bash_profile and ~/.bash_login and ~/.profile are only executed for interactive shells.
/etc/bashrc (Red Hat) or /etc/bash.bashrc (Ubuntu) are executed for non-interactive shells.

Iniciar sesión para comentar.

Más respuestas (1)

Nikunj Kothari
Nikunj Kothari el 25 de En. de 2017
Are you getting the same output if instead of using system(), you use the exclamation point? The following documentation link elaborates on how to properly run external commands and scripts:

Categorías

Más información sobre Startup and Shutdown en Help Center y File Exchange.

Etiquetas

Productos

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by