Làm thế nào để thực thi các lệnh trong gnuplot bằng cách sử dụng shell script?


10

Những gì tôi muốn làm là viết một kịch bản đầu tiên khởi chạy một chương trình và sau đó bảo nó thực thi một loạt các lệnh và sau đó thoát. Hãy đi với một ví dụ.

Tôi đã viết kịch bản này myscript.shvà nó không hoạt động theo cách tôi muốn. Những gì nó làm chỉ là chạy gnuplot và chờ cho nó thoát và sau đó chạy các lệnh khác; mà rõ ràng là tạo ra lỗi.

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

Tôi đoán rõ ràng những gì tôi đang cố gắng làm; Nếu không, sau đó cho tôi biết trong các ý kiến.

Câu trả lời:


11

Từ man gnuplothoặc trang web trực tuyến của nó :

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

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

Vì vậy, những gì bạn có thể muốn chạy là lệnh sau:

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

Các biến thể khác tôi đã đề xuất nhưng không hữu ích là:

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

2 đầu tiên sản xuất chính xác đầu ra mong muốn. Mặc dù -pkhông được sử dụng nhiều trong ví dụ này; nếu bạn nhấn enter trong terminal, gnuplot sẽ thoát và cửa sổ cốt truyện trở nên hoàn toàn không tương tác, ngoại trừ lệnh thoát. Đầu ra của thứ 3 chỉ đến và đi (hoàn toàn không hiển thị). Cái cuối cùng tạo ra đầu ra, nhưng vì gnuplot đóng ngay lập tức, cửa sổ cốt truyện lại không tương tác (ngoài ra, nó hiển thị một âm mưu nhỏ 1 cm vuông). Như vậy pause -1là cần thiết.
Mihir Gadgil

@MihirGadgil Cảm ơn bạn đã phản hồi. Chỉnh sửa câu trả lời của tôi.
Chỉ huy Byte

15

Một cách là với -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

một cách khác, nếu bạn cần xử lý trước dữ liệu, là với Bash Here Document(xem 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
Phương thức shell "here-doc" này có lẽ là câu trả lời chung mà OP tìm kiếm. Nó sẽ hoạt động cho rất nhiều chương trình điều khiển bằng lệnh (và nếu không, bạn có thể leo thang đến expect...
Rmano

Ngoài ra, bạn có thể thực thi các tập lệnh với chmod u+x myscript.gnuvà thực thi trực tiếp ./myscript.gnu chỉ bằng một ghi chú mà bạn quên []trong yrange : set yrange [$minval:$maxval].
Hastur

3

Như đã giải thích trong các mantrang , gnuplotmong đợi đầu vào từ một tệp lệnh trong cái được gọi là phiên lô . Bạn có thể ví dụ viết dòng plot sin(x)vào một tệp myplotvà sau đó thực thi gnuplot myplot.

Nếu bạn bỏ qua tệp lệnh, như tập lệnh của bạn, bạn sẽ có một phiên tương tác .


Được rồi, tôi hiểu rằng nó nhảy vào một phiên tương tác, nhưng không có cách nào để đưa các lệnh vào phiên tương tác đó thông qua cùng một sctipt? Ngoài ra, bạn có thể đưa ra một câu trả lời tổng quát hơn (không cụ thể cho gnuplot) không? Cảm ơn!
Mihir Gadgil

Không, không phải tất cả các ứng dụng xử lý đầu vào theo cùng một cách. Không có cách nào để khái quát điều đó.
Jos

@MihirGadgil - không phải tất cả các chương trình đều hoạt động theo cùng một cách ... bạn muốn sử dụng chương trình nào khác?
Wilf

@Jos ơi, tôi hiểu rồi, cảm ơn! Wilf Tôi đã sử dụng linux trong quá khứ nhưng không rộng rãi, bây giờ cố gắng tìm hiểu thêm. Tôi không có bất kỳ chương trình nào như vậy trong tâm trí; chỉ cố gắng học càng nhiều càng tốt từ vấn đề này.
Mihir Gadgil

0

Phương pháp here-doc được đề cập rất hữu ích với Gnuplot và với nhiều chương trình khác. Bằng cách sử dụng các biến shell trong các lệnh Gnuplot trong tài liệu ở đây, bạn có thể tham số hóa các lô của mình bằng các đầu vào từ dòng lệnh của shell script. Bằng cách thiết lập mọi thứ một cách khó khăn, bạn có thể tạo ra các lô từ các kho "dữ liệu lớn". Tôi đã từng tạo ra các ô phân tán trông có vẻ nhất quán với 20.000 đến 80.000 điểm PER PLOT trong hàng trăm phân tích hữu hạn cấu trúc động học chạy chính xác bằng phương pháp này. Đó là một phương pháp rất mạnh mẽ.


1
Để hoàn thành câu trả lời của bạn, bạn có thể thêm một ví dụ về cách sử dụng phương pháp được đề cập ở đây không?
Melebius

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.