以编程方式确定脚本是否正常发布或执行

Programmatically determine if a script is being published or executed normally

在发布 R2016a 之前,publishing 是 MATLAB 中 记录脚本结果的方式。我发现当我手动 运行 脚本时,我经常在整个脚本中放置 pause 命令。有没有一种简单的方法可以确定脚本是否已发布?然后,我可以用一些代码来包装我的暂停:

if isNotPublishing
    pause();
end

我的 google foo 未能找到解决方案。

一个简单的方法是查看 publish 是否在调用堆栈中。 dbstack 将 return 一个 struct 的数组,指示以何种顺序调用哪些函数以到达我们调用 dbstack 的点。我们可以使用 name 属性 来告诉我们所有这些函数的名称,并查看 publish 是否在其中。如果是,那么我们假设脚本是通过 publish.

调用的
stack = dbstack;
isBeingPublished = ismember('publish', {stack.name});

或者,如果您希望它是单行的

isBeingPublished = ismember('publish', cellfun(@(x)x.name, dbstack, 'UniformOutput', 0));

无论您是使用 Publish 工具栏还是使用

从命令行发布脚本,这都应该有效
publish('myscript.m')

如果你想变得非常花哨,你可以重载 pause(或编写你自己的版本,mypause)来为你执行此检查。这是有效的,因为在您的新 pause 函数中,dbstack 仍将包含 publish,因为您从最终由 publish 评估的脚本中调用它。如果您创建此函数,那么您的代码中就不需要所有这些逻辑,只需调用 mypause() 即可。

function mypause(varargin)
    stack = dbstack;
    if ~ismember('publish', {stack.name});
        builtin('pause', varargin{:})
    end
end