Часть-1: В октаве 3.4.3 (на centos 6.6) следующий файл сценария "joe.m" (но для 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'
Но в октаве 4.2.1 он выдает предупреждение и, кажется, автоматически вызывает (!?) jim, и НЕ запускает немедленный код верхнего уровня (!?), нет строки вывода "call 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 теперь предупреждение отсутствует, но по-прежнему отсутствует строка "вызывающего джима".
Часть 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 (автономный сценарий) в попытке не «задать неправильный вопрос» или преждевременно оптимизировать вопрос для моего собственного «попытки решения», но поведение такое же, как с ним, так и без него. Мне нужен сценарий, чтобы: не использовать абсолютный путь к октаве и принимать дополнительные отдельные параметры (я не мог объединить --no-gui в -qf в 4.2.1). Ваши упрощения приветствуются.
Спасибо. Я сделал правку, чтобы объяснить. Может быть, мне лучше выделить шебанг на послесловие.





Существуют различные типы файлов .m, включая (согласно Octave 4.2.1):
Function:
Файл, содержащий определение одной или нескольких функций. Имя файла функции часто совпадает с именем первой функции, определенной в файле.Файлы Script:
Файл, содержащий строки кода, включая определение функций.
Unlike a function file, a script file must not begin with the keyword function . If it does, Octave will assume that it is a function file, and that it defines a single function that should be evaluated as soon as it is defined.
Файлы определения классов.
Поведение Octave при выполнении как:
$octave File
задокументирован в одном из исходных файлов (oct-parse.yy) Octave:
Execute the contents of a script file. For compatibility with Matlab, also execute a function file by calling the function it defines with no arguments and nargout = 0.
Здесь, поскольку ваш файл начинается с ключевого слова функция, он считается файлом функции, поэтому функция jim вызывается автоматически независимо от того, вызываете вы jim или нет. Таким образом, вы можете удалить выражение jim из конца файла и увидеть, что функция вызывается автоматически. В версии 3.4.3 я думаю, что это предполагается как файл сценария.
Чтобы решить проблему, вам нужно добавить выражение, отличное от ключевого слова функция, в начало файла, чтобы преобразовать его в файл сценария:
#!/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
Это большая помощь. Совместимость 3.x и 4.x все еще не решена. И я получаю бесплатные предупреждения (4.x кажется минным полем предупреждений), имя функции и имя файла предупреждают, когда они совпадают (файл сценария), а когда нет (файл функции).
Если вы хотите отключить предупреждения, вы можете поместить следующую команду в файл запуска: warning( 'off','Octave:function-name-clash'). Вы можете найти список всех предупреждений здесь. Я считаю, что поведение 3.x является ошибкой и будет исправлено позже. Если вам нужна 3.x, вы можете установить и 4.x, и 3.x и использовать то, что хотите.
Я нашел единственный способ отключить предупреждение, когда файл сценария имеет функцию с тем же именем, - это warning( 'off','all');, и нет возможности сделать это вовремя при использовании -qf. Заставляет меня переименовывать функции (или файлы скриптов) из 3-й октавы, чтобы использовать их в 4-й октаве.
Если строка shebang не имеет отношения к вопросу, удалите ее. Мне потребовалось время, чтобы разобрать это. Позвольте людям сосредоточиться на том, что для является важно. См. минимальный воспроизводимый пример (особенно часть минимальный!).