列出Matlab中的所有环境变量

Posted

技术标签:

【中文标题】列出Matlab中的所有环境变量【英文标题】:List all environment variables in Matlab 【发布时间】:2013-11-15 15:47:29 【问题描述】:

如何在 Matlab 中获得所有已定义环境变量的列表?我知道getenv,但您必须提供一个名称,而doc getenv 在如何使用它以任何其他方式检索项目方面没有提供任何帮助。我在网上找不到任何其他相关信息。这甚至可能吗?

我对独立于平台的答案(或至少是 Windows 和 Linux)感兴趣。

【问题讨论】:

【参考方案1】:

你可以使用

system('env')

在 linux/mac 上,以及

system('set') % hope I remember correctly, no windows at hand

在这两种情况下,您都必须解析输出,因为它的格式为variable=<variable-value>

【讨论】:

我修复了引号,并且按预期工作。老实说,列出变量及其值可能是一件好事,所以这工作得相当好。我仍然很好奇是否有一种真正独立于平台的方式,但由于环境变量相当依赖于平台,这可能会尽可能好。 您也可以在 MATLAB 控制台窗口中使用!env。就像附加提示一样。【参考方案2】:

下面是一个函数,它实现了两种检索所有环境变量的方法(两种方法都是跨平台的):

    在 MATLAB 中使用 Java 功能 使用系统特定的命令(如@sebastian 建议的那样)

注意:正如@Nzbuu 在 cmets 中解释的那样,使用 Java 的 System.getenv() 有一个限制,即它返回在 MATLAB 进程启动时捕获的环境变量。这意味着以后在当前会话中使用setenv 所做的任何更改都不会反映在Java 方法的输出中。基于系统的方法不受此影响。

getenvall.m

function [keys,vals] = getenvall(method)
    if nargin < 1, method = 'system'; end
    method = validatestring(method, 'java', 'system');

    switch method
        case 'java'
            map = java.lang.System.getenv();  % returns a Java map
            keys = cell(map.keySet.toArray());
            vals = cell(map.values.toArray());
        case 'system'
            if ispc()
                %cmd = 'set "';  %HACK for hidden variables
                cmd = 'set';
            else
                cmd = 'env';
            end
            [~,out] = system(cmd);
            vars = regexp(strtrim(out), '^(.*)=(.*)$', ...
                'tokens', 'lineanchors', 'dotexceptnewline');
            vars = vertcat(vars:);
            keys = vars(:,1);
            vals = vars(:,2);
    end

    % Windows environment variables are case-insensitive
    if ispc()
        keys = upper(keys);
    end

    % sort alphabetically
    [keys,ord] = sort(keys);
    vals = vals(ord);
end

例子:

% retrieve all environment variables and print them
[keys,vals] = getenvall();
cellfun(@(k,v) fprintf('%s=%s\n',k,v), keys, vals);

% for convenience, we can build a MATLAB map or a table
m = containers.Map(keys, vals);
t = table(keys, vals);

% access some variable by name
disp(m('OS'))   % similar to getenv('OS')

【讨论】:

是的,这个版本更干净,可能更独立于平台。我总是忘记 Matlab 中的 Java 技巧! Java 实际上给出了与getenvsetenv 不匹配的不同结果。见gist.github.com/Nzbuu/7c657a3b22f535eb41dc55e12e4440da。 @Nzbuu 有两点需要注意:1)System.getenv 返回启动 MATLAB 进程时的环境变量(JVM 嵌入在 MATLAB 中),这解释了为什么它没有从 @ 获取更改987654333@。这与产生新进程的system 不同 2) cmd.exe shell 有一些默认情况下不显示的私有变量(MS-DOS 时代遗留下来的)。一个技巧是将执行的命令更改为cmd = 'set "'; 以枚举它们,请参阅***.com/q/10431689/97160、blogs.msdn.com/b/oldnewthing/archive/2010/05/06/10008132.aspx 了解更多信息。 最后一个 hack (set + space + doublequote) 实际上是一个成为功能的错误 :) blogs.msdn.microsoft.com/oldnewthing/20140425-00/?p=1143 @Nzbuu:完成。我还将这两种方法组合成一个辅助函数(system based-one 是默认值)

以上是关于列出Matlab中的所有环境变量的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB之基本语法与基础函数

如何列出 c/c++ 应用程序中的所有环境变量

如何列出所有 Linux 环境变量,包括 LD_LIBRARY_PATH

怎么查看ubuntu里面的环境变量

ubuntu环境变量设置

Ubuntu设置和查看环境变量—笔记4