MATLAB getenv 无法找到某些 Linux 环境变量

C M*_*gan 5 linux shell matlab environment-variables

我有一个小问题 - 解决方法很简单,但我想了解问题存在的原因。我在 .bashrc 中设置了一些环境变量:

export FREESURFER_HOME=/usr/local/freesurfer
Run Code Online (Sandbox Code Playgroud)

在我的startup.m 文件中,我尝试设置变量:

freesurfer_home=getenv('FREESURFER_HOME');
Run Code Online (Sandbox Code Playgroud)

但是,对 getenv 的调用返回一个空字符数组。在 MATLAB 中调用 getenv 会返回一些环境变量(例如 getenv('HOME')),但不会返回其他变量。我可以通过以下行查看哪些环境变量对 MATLAB 可见:

 map = java.lang.System.getenv();
Run Code Online (Sandbox Code Playgroud)

我还可以确认缺失值是可见的,至少在外壳内,使用任何

export
env
printenv
Run Code Online (Sandbox Code Playgroud)

对于这种差异有解释吗?

div*_*nov 2

如果您在 Matlab 中使用systemps f命令检查进程树,您将看到它实际上启动sh并执行您的命令。我没有Matlab,Octave也是如此。

octave:1> system("ps f")
  PID TTY      STAT   TIME COMMAND
 2520 pts/0    Ss     0:00 bash
 2580 pts/0    Sl+    0:02  \_ octave
 2885 pts/0    S+     0:00      \_ sh -c ps f
 2886 pts/0    R+     0:00          \_ ps f
ans = 0
Run Code Online (Sandbox Code Playgroud)

.bashrc在这种情况下,当我从 bash 启动 Octave 时,可以通过getenv获得设置的变量。但当从菜单启动器启动 Matlab 时,情况有所不同:

octave:1> system("ps f")
  PID TTY      STAT   TIME COMMAND
 3400 pts/2    Ssl+   0:01 /usr/bin/octave
 3444 pts/2    S+     0:00  \_ sh -c ps f
 3445 pts/2    R+     0:00      \_ ps f
Run Code Online (Sandbox Code Playgroud)

bash 尚未执行,并且.bashrc未设置导出。