Максимальная командная строка v5.43 ведет себя иначе, чем v5.41 - PullRequest
1 голос
/ 03 мая 2020

Я недавно обновил максимумы с 5.41.0 до 5.43.2, и это сломало мой код. Я не мог найти решение, которое работает в обеих версиях одинаково. Вот упрощенный пример командной строки, который я выполняю:

В версии 5.41.0:

user@system:~> maxima -version
Maxima 5.41.0
user@system:~>  maxima --very-quiet -r 'display2d: false$ leftjust: true$ ratprint: false$ dispflag: false$      is(equal((a+b)**2 = (a**2 + b**2 + 2*a*b), (a+b)*(a+b) = (a**2 + b**2 + 2*a*b))); ttyoff:true$ quit()$'
true
user@system:~>

В версии 5.43.2:

user@system:~> maxima -version
Maxima 5.43.2
user@system:~>  maxima --very-quiet -r 'display2d: false$ leftjust: true$ ratprint: false$ dispflag: false$      is(equal((a+b)**2 = (a**2 + b**2 + 2*a*b), (a+b)*(a+b) = (a**2 + b**2 + 2*a*b))); ttyoff:true$ quit()$'
display2d:false
leftjust:true
ratprint:false
dispflag:false
is(equal((a+b)^2 = a^2+b^2+2*a*b,(a+b)*(a+b) = a^2+b^2+2*a*b))
true
ttyoff:true

Существует два Команда questions (1) в v5.43.2 не завершает работу после завершения максимумов, чтобы вернуться в командную строку оболочки, где, как и в v5.41.0, она выходит из максимумов и возвращается в командную строку оболочки. (2) поэтому я добавил quit () $, но эхо команд не подавляется с помощью терминатора $.

Я попытался прочитать документы, чтобы найти какую-либо информацию по этому вопросу, но не увидел ничего очевидного. Моя цель - спокойно выполнить переданную команду и распечатать только вывод (последней) команды. Любая помощь в этом вопросе очень ценится.

1 Ответ

2 голосов
/ 04 мая 2020

При просмотре журнала Git выясняется, что поведение --run-string (т. Е. -r) было изменено в коммите fa97979. Таким образом, текущее поведение считается правильным, для чего оно стоит. Тем не менее, по адресу (1), вы можете попробовать опцию --batch-string вместо --run-string.

About (2), хотя знак доллара подавляет вывод, ввод по-прежнему отображается, и вот что ты видишь. Я не знаю способ подавления ввода также. На данный момент я вижу несколько возможных подходов.

Один из них - пропустить --very-quiet, чтобы получить метки ввода и вывода. Затем выполните grep для вывода меток вывода или, точнее, grep для метки вывода, за которой следует ноль или более строк, которые не имеют метки (для захвата многострочного вывода).

Другой подход заключается в том, чтобы просто забыть о метках и сказать with_stdout("/tmp/foo.out", print(...)), где вы распечатываете материал, который имеет отношение к дальнейшей обработке, а затем просто выгрузить файл /tmp/foo.out или как он будет вызван впоследствии. Это немного неуклюже, но, вероятно, проще получить именно то, что вы хотите в выходном файле.

Иногда я создаю bash сценарии, которые выглядят как

cat << EOF > /tmp/foo.mac
someflag: true;
somevar: 1234;
foo: expand (something (something));
EOF
maxima --batch=/tmp/foo.mac

, поэтому bash скрипт создает программу Maxima, а затем Maxima выполняет ее. Это особенно полезно, если я хочу использовать bash переменные (например, имена файлов или что-то) в программе Maxima, например

f=$1-$2.csv  # something I just made up
cat << EOF > /tmp/foo.mac
myinput: openr ("$f");
/* etc etc */
EOF
...