วิธีรันคำสั่งใน gnuplot โดยใช้เชลล์สคริปต์


10

สิ่งที่ฉันต้องการจะทำคือเขียนสคริปต์ที่เปิดตัวโปรแกรมก่อนแล้วจึงบอกให้รันคำสั่งจำนวนมากแล้วออกจากโปรแกรม ให้ไปด้วยตัวอย่าง

ฉันเขียนสคริปต์นี้myscript.shและมันไม่ทำงานอย่างที่ฉันต้องการ สิ่งที่มันเป็นเพียงเรียกใช้ gnuplot และรอให้มันเลิกแล้วรันคำสั่งอื่น ๆ ; ซึ่งสร้างข้อผิดพลาดอย่างเห็นได้ชัด

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

ฉันคิดว่ามันชัดเจนว่าฉันกำลังพยายามทำอะไร ถ้าไม่เช่นนั้นแจ้งให้เราทราบในความคิดเห็น

คำตอบ:


12

จากman gnuplotหรือmanpage ออนไลน์ :

   -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 ออกจากและหน้าต่างการพล็อตกลายเป็นแบบไม่โต้ตอบทั้งหมดยกเว้นคำสั่งออกจาก เอาต์พุตของอันดับ 3 เพิ่งมาและไป (ไม่ปรากฏเลย) อันสุดท้ายสร้างเอาต์พุต แต่เนื่องจาก gnuplot ปิดทันทีหน้าต่างพล็อตนั้นไม่สามารถโต้ตอบได้อีกด้วย ดังนั้นจึงpause -1จำเป็น
Mihir Gadgil

@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
เลื่อนดู

นอกจากนี้คุณสามารถทำให้ปฏิบัติการสคริปต์ด้วย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

ไม่แอปพลิเคชันทั้งหมดไม่ได้ประมวลผลอินพุตด้วยวิธีเดียวกัน ไม่มีทางที่จะพูดคุยเรื่องนั้นได้
Jos

@MihirGadgil - โปรแกรมทั้งหมดไม่ทำงานในลักษณะเดียวกัน ... โปรแกรมอื่นที่คุณต้องการใช้
วิลฟ์

@Jos โอ้ฉันเข้าใจแล้วขอบคุณ! ฉันเคยใช้ลินุกซ์ในอดีต แต่ไม่ครอบคลุมตอนนี้ฉันพยายามเรียนรู้เพิ่มเติม ฉันไม่มีโปรแกรมดังกล่าวอยู่ในใจ แค่พยายามเรียนรู้ให้มากที่สุดเท่าที่จะทำได้จากปัญหานี้
Mihir Gadgil

0

วิธีการที่นี่ - doc กล่าวถึงมีประโยชน์อย่างมากกับ Gnuplot และกับโปรแกรมอื่น ๆ อีกมากมายเช่นกัน โดยการใช้ตัวแปรเชลล์ภายในคำสั่ง Gnuplot ใน here-doc คุณสามารถกำหนดพารามิเตอร์ของพล็อตของคุณด้วยอินพุตจากบรรทัดคำสั่งของเชลล์สคริปต์ คุณสามารถสร้างแผนการจำนวนมากได้จาก "ข้อมูลขนาดใหญ่" ฉันเคยสร้างแผนการกระจายที่มีรูปลักษณ์ที่สม่ำเสมอโดยมี 20,000 ถึง 80,000 คะแนนต่อจุดในการวิเคราะห์เชิงพลศาสตร์เชิงโครงสร้างหลายร้อยครั้งโดยใช้วิธีการนี้ มันเป็นวิธีที่ทรงพลังมาก


1
เพื่อให้คำตอบของคุณเสร็จสมบูรณ์คุณสามารถเพิ่มตัวอย่างวิธีใช้วิธี here-doc ที่กล่าวถึงได้หรือไม่
Melebius

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.