2

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

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

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

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

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


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

3 ответа3

0

Следующий скрипт будет делать то, что вы просите, как я понимаю. Он будет запускать последовательность команд 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 для удобства - подсказка, информация о команде выхода. С ними лучше обращаться по именованной трубе.

0

Если вы работаете в системе * 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
gnuplot -e "print 'here I am'" -

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .