シェルスクリプトを使用してgnuplotでコマンドを実行する方法


10

私がやりたいことは、まずプログラムを起動し、次に一連のコマンドを実行して終了するように指示するスクリプトを作成することです。例を挙げましょう。

このスクリプトを作成しましたがmyscript.sh、思いどおりに動作しません。gnuplotを実行して終了するのを待ってから、他のコマンドを実行するだけです。明らかにエラーが発生します。

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

私がやろうとしていることは明らかだと思います。そうでない場合は、コメントでお知らせください。

回答:


12

From 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この例では、多くの使用ではありません。ターミナルでEnterキーを押すと、gnuplotは終了し、プロットウィンドウはquitコマンドを除いて完全に非対話型になります。3番目の出力が出入りするだけです(まったく表示されません)。最後のものは出力を生成しますが、gnuplotはすぐに閉じるので、プロットウィンドウは再び非対話型になります(また、小さな1square cmプロットが表示されます)。だからpause -1必要です。
Mihir Gadgil、2015年

@MihirGadgilフィードバックをありがとう。私の答えを編集しました。
バイトコマンダー

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]
Hastur

3

manページで説明されているように、gnuplotバッチセッションと呼ばれるコマンドファイルからの入力を想定しています。たとえば、その行plot sin(x)をファイルに書き込んでからmyplot実行できgnuplot myplotます。

スクリプトのようにコマンドファイルを省略すると、対話型セッションになります。


わかりました。インタラクティブセッションにジャンプしますが、同じsctiptを介してそのインタラクティブセッションにコマンドを送る方法はありませんか?また、(gnuplotに限定されない)より一般的な答えを教えていただけますか?ありがとう!
Mihir Gadgil、2015年

いいえ、すべてのアプリケーションが入力を同じ方法で処理するわけではありません。それを一般化する方法はありません。
Jos

@MihirGadgil-すべてのプログラムが同じように機能するわけではありません...他にどのプログラムを使用しますか?
Wilf、2015年

@ジョスああ、なるほど、ありがとう!Wilf私は過去にLinuxを使用しましたが、広範囲には使用していません。私はそのようなプログラムを考えていません。この1つの問題からできるだけ多くのことを学ぼうとしています。
Mihir Gadgil 2015年

0

上記のhere-docメソッドは、Gnuplotや他の多くのプログラムでも非常に役立ちます。ヒアドキュメントのGnuplotコマンド内でシェル変数を使用することにより、シェルスクリプトのコマンドラインからの入力でプロットをパラメーター化できます。物事を巧みに設定することで、「ビッグデータ」の膨大な一群からプロットを大量に作成できます。私は、この方法を正確に使用して何百もの構造動力学有限解析を実行し、1プロットあたり20,000〜80,000ポイントの一貫した外観の散布図を作成していました。これは非常に強力な方法です。


1
あなたの答えを完全にするために、言及されたhere-docメソッドの使用方法の例を追加できますか?
Melebius

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.