如何在MatLab中创建命令别名

yk9xbfzb  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(273)

在MatLab中有没有类似于Unix“别名”的概念?
这个问题Is there a way to do command aliasing in matlab R2011b?建议定义匿名函数,并扩展答案,这些函数可以在启动时获得源代码,但这会导致函数句柄出现在工作区中,当清除时,它将消失。
有没有更健壮和Unix类似的解决方案?看起来这是一件非常有用的事情...

slhcrj9b

slhcrj9b1#

我不知道你为什么要这么做,但是...
假设您愿意在PATH上有一个专门用于别名的目录,您可以在该目录中创建m个文件来运行这些别名。在这种情况下,工作区中将不存在别名。当然,您也可以自己编写别名文件,但下面的函数会自动为您创建别名。如果您尝试别名的函数/脚本当前不在搜索路径上,则该函数可能会被混淆。该函数并不是“完美的”,因为您不会编写

alias myAlias = run('full/path/to/some/script')

而是更确切地说

alias myAlias full/path/to/some/script
function alias(aliasName, functionName)
% alias myfoo foo

    aliasPath = './alias';
    isscript = false;
    try
        nargin(functionName);
    catch %#ok<CTCH>
        isscript = true;
    end
    
    if isscript
        fileID = fopen([aliasPath, aliasName, '.m'],'w');
        fprintf(fileID, '%s\n', ['run(', functionName, ')']);
        fclose(fileID);
    else
        fileID = fopen([aliasPath, aliasName, '.m'],'w');
        fprintf(fileID, '%s\n', ['function varargout = ', aliasName, '(varargin)']);
        fprintf(fileID, '\t%s\n', ['varargout{1:nargout} = ', functionName, '(varargin{:});']);
        fprintf(fileID, '%s\n', 'end');
        fclose(fileID);
    end
end
aydmsdu9

aydmsdu92#

是的,有一种方法。它被称为函数。您只需编写一个函数来执行您希望别名执行的任何操作。例如:

function cdhome
    cd(getenv('MATLABUSERPATH'))

然后只需在命令行中输入cdhome,就像Unix外壳中的别名一样。请注意,MATLABUSERPATH是我在startup.m中定义的环境变量。可以更简单,只需保存一个名为cdhome.m的脚本,其中包含以下内容:

cd(getenv(<ENVIRONMENT_VARIABLE_THAT_DEFINES_MY_FAVORITE_PATH>))

或者这样怎么样:

clc; clear; close all;

将其保存在名为clean.m的脚本文件中,然后只需将clean而不是clc; clear; close all;放在脚本的顶部
不,它并不完全遵循Unix的想法,即在启动时执行的单个配置文件中有一堆别名。
但你也可以这么做。将您的所有别名放在一个开关块中,在一个函数中,将其命名为alias

function alias(thecalledalias)
        switch thecalledalias
            case somealias
                % ... define some alias
            case someotheralias
                % ... define some other alias
         end

对于自动完成,您可以通过您的外壳获得,将一个functionSignatures.json文件放在与alias.m函数文件相同的文件夹中,并用您的别名填充它:

{
   "_schemaVersion": "1.0.0",
   "alias":
   {
      "inputs":
      [
         {"name":"thecalledalias", "kind":"required", 
         "type":["char", "choices={'somealias','someotheralias'}"]}
      ]
  }
}

然后,当您在命令行中键入alias(...)时,您将获得自动完成。
但对我来说,拥有一个文件夹更容易,将其命名为myaliases,每个别名都有一个脚本或函数,并且您可以在命令行中自动完成,就像调用任何函数时一样(即,不需要键入alias(<somealias>))。

相关问题