web-dev-qa-db-ja.com

gnuplotでインタラクティブセッションを開始し、開いたらいくつかのコマンドを実行します

スクリプトを実行すると、

  1. Gnuplotでターミナルを開く(インタラクティブセッション)
  2. いくつかのgnuplotコマンドを実行します。
  3. インタラクティブセッションは開いたままです。 (ユーザーはコマンドを実行できます)

コードを実行する-eフラグを試しましたが、ターミナルが閉じてインタラクティブではありません。

-pフラグは、プロットウィンドウを存続させますが、これは私が必要とするよりも少ないです。

また、-e-フラグにgnuplotスクリプトをロードしてみましたが、インタラクティブセッションが開始されることを期待していますが、役に立ちません。


私の現在の回避策は、xteを使用してキーストロークを送信することです。これは機能しますが、少しハックです。より良い解決策はありますか?

3
Gilles Castel
gnuplot -e "print 'here I am'" -

動作するはずです

2
bibi

次のスクリプトは、私が理解しているように、あなたが求めていることを実行します。一連の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. これを改善するには、 名前付きパイプ を見てください。このようなスクリプトを長期間使用する場合は、保守性の理由からその方法を使用します。このスクリプトは、より多くの「ブルート」フォースメソッドで非常に類似した結果を取得しています。

    たとえば、私は便宜上gnuplotに行かないものにstderrを使用しています-プロンプト、終了コマンド情報。それらは名前付きパイプでより適切に処理されます。

0
Argonauts

* 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
sputnick1124