第1部分:在脚本文件“ joe.m”之后的八度3.4.3(在centos 6.6中)(但对于3.x 减 --no-gui
):
#!/bin/bash
# for-bash:
#{
exec octave -q --no-gui --no-init-file "$0" ${1+"$@"}
#}
# for-octave:
function jim ()
printf ("program_name: '%s'\n", program_name ());
endfunction
printf ("calling jim\n")
jim
产生输出:
calling jim
program_name: 'joe.m'
但是在octave 4.2.1中,它发出警告,并且似乎自动调用(!?)jim,并且不运行顶级立即代码(!?),没有输出行“调用jim”:>
warning: function name 'jim' does not agree with function filename '/tmp/joe.m'
program_name: 'joe.m'
第2部分:如果我将同一文件重命名为“ jim.m”,则在倍频程3.4.4中,输出为:
calling jim
program_name: 'jim.m'
现在在八度4.2.1中避免了警告,但仍然缺少“ calling jim”行。
第3部分:在定义了零个功能的情况下,顶级代码 将在两个版本中执行。
在哪里记录或控制了这些行为(以及行为从版本3到版本4的更改)?
https://octave.org/doc/v4.2.1/Command-Line-Options.html
https://octave.org/doc/v4.2.1/Executable-Octave-Programs.html
一个人如何编写一个与3.x和4.x版本都兼容的八度文件,或者如何使用一个附加选项调用4.x以使其与3.x兼容?即使定义了函数,如何在4.x中执行顶级代码?
在没有相同文档的情况下,如何确定性地(无需反复试验)知道4.x中将自动调用哪些函数(以及使用哪些参数)?此示例不足以说明问题,因为只有一个功能:如果有多个功能(joe和jim),相对于文件名是否匹配,顺序是否重要?
编辑:我包含了shebang(自包含脚本),试图不“提出错误的问题”或针对我自己的“尝试解决方案”过早地优化问题,但无论有无,其行为都是相同的。我需要脚本来:不要使用绝对路径来八度,而要接受额外的单独选项(我无法在4.2.1中将--no-gui
合并到-qf
中)。欢迎您进行简化。
答案 0 :(得分:4)
.m文件类型不同,包括(根据Octave 4.2.1):
Function
文件:
包含一个或多个功能的定义的文件。函数文件的名称通常与文件中定义的第一个函数的名称匹配。 Script
文件:
包含代码行(包括函数定义)的文件。
与功能文件不同,脚本文件不能以关键字 function 开头。如果是这样,Octave将假定它是一个功能文件,并且它定义了一个应在定义后立即求值的功能。
类定义文件。
Octave的行为执行为:
$octave File
记录在Octave的一个源文件(oct-parse.yy)中:
执行脚本文件的内容。为了与Matlab兼容,还可以通过调用不带参数且nargout = 0的函数来执行函数文件。
在这里,因为您的文件以关键字 function 开头,因此它被视为功能文件,因此无论是否调用jim
,都会自动调用功能jim
。因此,您可以从文件末尾删除表达式jim
,并看到该函数被自动调用。在3.4.3版中,我认为它被认为是脚本文件。
要解决该问题,您需要在文件的开头添加除 function 关键字之外的表达式,以将其转换为脚本文件:
#!/bin/bash
# for-bash:
#{
exec octave -q --no-init-file "$0" ${1+"$@"}
#}
# for-octave:
1;
function jim ()
printf ("program_name: '%s'\n", program_name ());
endfunction
printf ("calling jim\n")
jim