Запустите интерактивный сеанс в gnuplot и выполните некоторые команды, когда он откроется

802
Gilles Castel

Когда я выполняю свой сценарий, он должен

  1. Откройте терминал с помощью gnuplot (интерактивный сеанс)
  2. Выполните несколько команд gnuplot.
  3. Интерактивный сеанс остается открытым. (пользователь может выполнять команды)

Я попробовал -eфлаг, который выполняет код, но терминал закрывается и не является интерактивным.

-pФлаг позволяет окно участка выжить, что меньше, чем мне нужно.

Я также попытался загрузить скрипт gnuplot в -e-flag, надеясь, что это запустит интерактивный сеанс, но безрезультатно.


Мой текущий обходной путь - отправка нажатий клавиш xte, что работает, но немного странно. Есть ли лучшие решения?

2

3 ответа на вопрос

0
Argonauts

Следующий скрипт будет делать то, что вы просите, как я понимаю. Он будет запускать последовательность команд gnuplot неинтерактивно, а затем продолжит тот же сеанс gnuplot из командной строки. Комментарии в сценарии указывают, куда вы должны поместить неинтерактивные команды.

#!/bin/bash -   # Cheap 'trick' to show gnuplot prompt # There are better ways prmpt () { (echo -n "gnuplot> " >&2) }  # Function that serves as a pipe to gnuplot;  # non-interactively then interactively gnuplotInPipe () { # simple example from http://gnuplot.sourceforge.net/demo/simple.html # All non interactive stuff goes here: echo "set title \"Simple Plots\" font \",20\"" echo "set key left box" echo "set samples 50" echo "set style data points" echo "plot [-10:10] sin(x),atan(x),cos(atan(x))" # end of non-interactive gnuplot commands (echo "Type 'quit' to exit" >&2) prmpt  # Here we read in lines (terminated with newline) # and pipe them directly to the same gnuplot # session while true; do read -er cmd if [ "$cmd" == 'quit' ]; then break fi echo "$cmd" prmpt  done }  # Call gnuplotInPipe and pipe it's output # to gnuplot gnuplotInPipe | gnuplot  

Заметки:

  1. Метод, который я использую для эмуляции приглашения gnuplot, - это быстрый взлом, который, несомненно, может быть улучшен и на самом деле совершенно не нужен.

  2. Если это не то, что вы пытаетесь сделать, пожалуйста, предоставьте команды, которые вы запускаете (пробовали) из терминала, а также достаточную выдержку из скрипта gnuplot, который вы вызываете.

  3. Чтобы улучшить это, взгляните на именованные каналы . Если вы хотите сохранить такой скрипт для длительного использования, я бы пошел по этому пути из соображений удобства обслуживания. Этот скрипт получает очень похожий результат с более «грубыми» методами.

    Например, я использую stderr для вещей, которые не идут в gnuplot для удобства - подсказка, информация о команде выхода. С ними лучше обращаться по именованной трубе.

Большой! Это было именно то, что я хотел, и менее хакерский, чем то, что я имел. Gilles Castel 8 лет назад 0
0
sputnick1124

Если вы работаете в системе * nix (я использую Linux), то все выглядит как файл, а это значит, что мы можем прочитать наш текущий сеанс терминала так же, как и обычный файл.

Я поместил следующее в конец моего скрипта gnuplot, чтобы получить имя моего терминала, и «загрузил» его так же, как и обычный скрипт:

set title 'Interactive session' plot 'mydata.dat' ︙ etc ︙ tty=system("tty") # execute the command "tty" in OS and store output load tty # load the tty like a file 

Вы не получаете никаких подсказок, но это хорошо работает для моих целей. Вы можете продолжить печатать в терминале; нажатие Enter (или Return, или как называется ваш ключ конца строки) отправит строку в сеанс gnuplot.  Ctrl+ Dвыйдет из сессии как обычно.

0
bibi
gnuplot -e "print 'here I am'" - 

должно сработать

Похожие вопросы