Как выполнять команды в gnuplot, используя скрипт оболочки?


10

Я хочу написать скрипт, который сначала запускает программу, а затем говорит ей выполнить несколько команд, а затем завершить работу. Давайте рассмотрим пример.

Я написал этот скрипт, myscript.shи он не работает так, как я хочу. Он просто запускает gnuplot и ждет его завершения, а затем запускает другие команды; что, очевидно, приводит к ошибкам.

#!/bin/bash
gnuplot
plot sin(x)
pause -1
quit

Я думаю, понятно, что я пытаюсь сделать; если нет, то дайте мне знать в комментариях.

Ответы:


12

С man gnuplotили его онлайн-страницы :

   -p,  --persist  lets  plot  windows  survive after main gnuplot program
   exits.

   -e "command list" executes the requested commands  before  loading  the
   next input file.

Итак, что вы, вероятно, хотите запустить, это следующая команда:

gnuplot -e "plot sin(x); pause -1"

Другие варианты, которые я предложил, но не очень полезные:

gnuplot -p -e "plot sin(x); pause -1"
gnuplot -e "plot sin(x)"
gnuplot -p -e "plot sin(x)"

Первые 2 дают точно желаемый результат. Хотя -pв этом примере это не очень полезно; если вы нажмете ввод в терминале, gnuplot выйдет, и окно графика станет полностью неинтерактивным, за исключением команды выхода. Выход 3-го просто приходит и уходит (не видно вообще). Последний выводит вывод, но поскольку gnuplot закрывается немедленно, окно графика снова не является интерактивным (кроме того, оно показывает крошечный график площадью 1 кв. См). Так pause -1надо.
Михир Гадгил

@MihirGadgil Спасибо за отзыв. Отредактировал мой ответ.
Byte Commander

16

Один из способов заключается в -persist:

#!/usr/bin/gnuplot -persist
set title "Walt pedometer" font ",14" textcolor rgbcolor "royalblue"
set timefmt "%y/%m/%d"
set xdata time
set pointsize 1
set terminal wxt  enhanced title "Walt's steps " persist raise
plot "/home/walt/var/Pedometer" using 1:2 with linespoints

Другой способ, если вам нужно предварительно обработать данные, это с помощью Bash Here Document(см. man bash):

#!/bin/bash
minval=0    # the result of some (omitted) calculation
maxval=4219   # ditto
gnuplot -persist <<-EOFMarker
    set title "Walt pedometer" font ",14" textcolor rgbcolor "royalblue"
    set timefmt "%y/%m/%d"
    set yrange $minval:$maxval
    set xdata time
    set pointsize 1
    set terminal wxt  enhanced title "Walt's steps " persist raise
    plot "/home/walt/var/Pedometer" using 1:2 with linespoints
EOFMarker
# rest of script, after gnuplot exits

1
Этот (метод оболочки here-doc), вероятно, является общим ответом, который ищет OP. Он будет работать для многих командных программ (и если нет, вы можете перейти к expect...
Rmano

Более того , вы можете сделать исполняемые сценарии с chmod u+x myscript.gnuи выполнять непосредственно ./myscript.gnu Жюст ноту вы забыли []в YRange: set yrange [$minval:$maxval].
Хастур

3

Как объяснено на manстраницах , gnuplotожидается ввод данных из командного файла в так называемом пакетном сеансе . Например, вы можете записать строку plot sin(x)в файл myplotи затем выполнить gnuplot myplot.

Если вы пропустите командный файл, как это делает ваш скрипт, вы получите интерактивный сеанс .


Хорошо, я понял, что это переход в интерактивный сеанс, но нет ли способа передать команды в этот интерактивный сеанс через один и тот же sctipt? Кроме того, не могли бы вы дать более общий ответ (не относится к gnuplot)? Спасибо!
Михир Гадгил

Нет, не все приложения обрабатывают ввод одинаково. Нет способа обобщить это.
Йос

@MihirGadgil - не все программы работают одинаково ... какие еще вы хотите использовать?
Уилф

@Jos О, понятно, спасибо! Уилф Я использовал Linux в прошлом, но не очень широко, сейчас пытаюсь узнать больше. Я не имею в виду такие программы; просто пытаюсь извлечь уроки из этой одной проблемы.
Михир Гадгил

0

Упомянутый метод here-doc очень полезен для Gnuplot и многих других программ. Используя переменные оболочки в командах Gnuplot в here-doc, вы можете параметризовать свои графики с помощью входных данных из командной строки сценария оболочки. Благодаря простой настройке, вы можете массово производить сюжеты из огромных массивов «больших данных». Раньше я использовал точные диаграммы рассеяния с 20000 до 80000 точек на график в сотнях анализов конечной структуры с использованием именно этого метода. Это очень мощный метод.


1
Чтобы завершить свой ответ, не могли бы вы добавить пример использования упомянутого метода here-doc?
Мелебиус

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.