【问题标题】:MATLAB getenv unable to find some linux environment variablesMATLAB getenv 找不到一些 linux 环境变量
【发布时间】:2025-12-01 08:15:01
【问题描述】:

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

export FREESURFER_HOME=/usr/local/freesurfer

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

freesurfer_home=getenv('FREESURFER_HOME');

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

 map = java.lang.System.getenv();

我还可以确认缺失值是可见的,至少在 shell 中,使用任何一个

export
env
printenv

对这种差异有解释吗?

【问题讨论】:

  • 您是从 shell 还是从某个开始菜单启动 Matlab?在后一种情况下,.bashrc 可能不会被调用...
  • 我不在 Linux 上测试它,但是如果你在 .profile/.bash_profile 配置文件中设置环境变量呢?
  • 它真的很奇怪,我正在调用一个 bash 脚本并从 bash 脚本中定义 envvariable,然后我调用了 matlab 脚本,但它仍然找不到它。这不奇怪吗?

标签: linux matlab shell environment-variables


【解决方案1】:

如果您在 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

在这种情况下,.bashrc 中设置的变量可通过getenv 获得,因为我从 bash 启动 octave。但是从菜单启动器启动 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

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

【讨论】:

  • 它真的很奇怪,我正在调用一个 bash 脚本并从 bash 脚本中定义 envvariable,然后我调用了 matlab 脚本,但它仍然找不到它。这不奇怪吗?
  • 这取决于你如何调用一个shell脚本,你如何在那里定义一个变量,然后你如何调用Matlab脚本。