Jak wykonywać polecenia w gnuplot przy użyciu skryptu powłoki?

10

Chcę napisać skrypt, który najpierw uruchamia program, a następnie każe mu wykonać kilka poleceń, a następnie zakończyć. Chodźmy z przykładem.

Napisałem ten skrypt myscript.shi nie działa tak, jak chcę. Po prostu uruchom gnuplot i poczekaj, aż zakończy działanie, a następnie uruchom inne polecenia; co oczywiście powoduje błędy.

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

Myślę, że jasne jest, co próbuję zrobić; jeśli nie, daj mi znać w komentarzach.

Mihir Gadgil
źródło

Odpowiedzi:

12

Z man gnuplotlub na stronie internetowej :

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

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

Więc prawdopodobnie chcesz uruchomić następujące polecenie:

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

Inne warianty, które zaproponowałem, ale które nie są tak przydatne, to:

gnuplot -p -e "plot sin(x); pause -1"
gnuplot -e "plot sin(x)"
gnuplot -p -e "plot sin(x)"
Bajt Dowódca
źródło
Pierwsze 2 generują dokładnie pożądaną wydajność. Chociaż -pw tym przykładzie nie ma większego zastosowania; jeśli naciśniesz enter w terminalu, gnuplot kończy pracę, a okno wydruku staje się całkowicie nieinteraktywne, z wyjątkiem polecenia quit. Wyjście 3. przychodzi i odchodzi (zupełnie niewidoczne). Ten ostatni generuje dane wyjściowe, ale ponieważ gnuplot natychmiast się zamyka, okno wykresu znów nie jest interaktywne (pokazuje również mały wykres cm kwadratowy). Więc pause -1jest to konieczne.
Mihir Gadgil
@MihirGadgil Dzięki za opinię. Edytowałem moją odpowiedź.
Bajt Dowódca
16

Jednym ze sposobów jest -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

innym sposobem, jeśli potrzebujesz wstępnie przetworzyć dane, jest Bash Here Document(patrz 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
waltinator
źródło
1
Ta (metoda powłoki „tutaj-doc”) jest prawdopodobnie ogólną odpowiedzią, jakiej szukał OP. Będzie działał dla wielu programów sterowanych poleceniami (a jeśli nie, możesz eskalować do expect...
Rmano
Ponadto można tworzyć wykonywalne skrypty z chmod u+x myscript.gnui wykonać bezpośrednio ./myscript.gnu Tylko uwaga zapomnienia []w yrange: set yrange [$minval:$maxval].
Hastur
3

Jak wyjaśniono na manstronach , gnuplotoczekuje się danych wejściowych z pliku poleceń w tak zwanej sesji wsadowej . Możesz np. Zapisać linię plot sin(x)do pliku, myplota następnie wykonać gnuplot myplot.

Jeśli pominiesz plik poleceń, podobnie jak skrypt, uzyskasz interaktywną sesję .

Jos
źródło
Ok, rozumiem, że przeskakuje do interaktywnej sesji, ale czy nie ma sposobu, aby podawać polecenia do tej interaktywnej sesji przez ten sam sctipt? Czy mógłbyś również udzielić bardziej ogólnej odpowiedzi (nie specyficznej dla gnuplot)? Dzięki!
Mihir Gadgil
Nie, nie wszystkie aplikacje przetwarzają dane wejściowe w ten sam sposób. Nie da się tego uogólnić.
Jos
@MihirGadgil - nie wszystkie programy działają w ten sam sposób ... z których innych chcesz korzystać?
Wilf
@Jos, rozumiem, dziękuję! Wilf W przeszłości używałem Linuksa, ale nie za dużo, teraz staram się dowiedzieć więcej. Nie mam na myśli żadnych takich programów; po prostu staram się nauczyć jak najwięcej z tego jednego problemu.
Mihir Gadgil
0

Wspomniana tutaj metoda doc jest bardzo przydatna w Gnuplot i wielu innych programach. Używając zmiennych powłoki w poleceniach Gnuplot w niniejszym dokumencie, możesz sparametryzować swoje wykresy za pomocą danych wejściowych z wiersza poleceń skryptu powłoki. Poprzez roztropne konfigurowanie rzeczy możesz masowo produkować wykresy z ogromnej ilości „dużych zbiorów danych”. Kiedyś produkowałem spójnie wyglądające wykresy rozrzutu z 20 000 do 80 000 punktów na poletkę w setkach skończonych analiz dynamiki strukturalnej przy użyciu dokładnie tej metody. To bardzo skuteczna metoda.

Charles
źródło
1
Aby uzupełnić swoją odpowiedź, czy możesz dodać przykład, jak użyć wspomnianej metody tutaj-doc?
Melebius
0

To może pomóc

{#set terminal postfile             
{#set output  "d1_plot.ps"        
set title "Energy vs. Time for Sample Data"    
set xlabel "Time"    
set ylabel "Energy"    
plot "d1.dat" with lines   
pause -1 "Hit Enter to continue"

kliknij tutaj, aby uzyskać więcej informacji

lala khan
źródło