วิธีการแสดงจำนวนบรรทัดที่ส่งออกโดยคำสั่งในเวลาจริง?


15

ฉันใช้svn exportเป็นส่วนหนึ่งของสคริปต์แพ็คเก็ตสำหรับแอปพลิเคชันของฉันและดูเหมือนว่าคำสั่งนี้เหมือนกับคนอื่น ๆ มากมายไม่มีแถบความคืบหน้าใด ๆ

ฉันมีสองตัวเลือกในขณะนี้:

  • ใช้งานโดยไม่มีตัวเลือกและดูการพิมพ์หลายพันบรรทัด
  • ใช้--quietและไม่เห็นอะไรจนกว่ามันจะเสร็จสมบูรณ์

อย่างน้อยมีวิธีแสดงจำนวนบรรทัดเอาต์พุตตามคำสั่งแบบเรียลไทม์หรือไม่? เช่น:

Exporting SVN directory ... 1234 files

และเห็นการ1234 เพิ่มจำนวนนี้ในเวลาจริงหรือไม่ ฉันสามารถจินตนาการว่าการส่งออกไปยังคำสั่งที่จะทำแค่นี้ แต่อันไหน?

คำตอบ:


16
yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

หรือใส่ส่วนที่อยู่ในวงเล็บในเชลล์สคริปต์ โปรดทราบว่านี่จะใช้งานได้ถ้าเชลล์ของคุณรองรับตัวดำเนินการ preincrement เช่น bash หรือ ksh93 หรือ zsh มิฉะนั้นคุณจะต้องเพิ่ม$Iและพิมพ์ (ตามI=$((I+1));printf...) นอกจากนี้หากprintfไม่ใช่ builtin ที่มีเชลล์ของคุณ (เป็น builtin ที่มีทุบตีปัจจุบัน) คุณสามารถใช้echo -neหรือprint -nแทนเพื่อประสิทธิภาพที่ดีขึ้น คุณเพียงแค่ต้องการที่จะปราบปรามการขึ้นบรรทัดใหม่และให้ \ r ตีความเป็นตัวละครในการหลบหนี


โอ้ฉันจะไม่ทำให้ตัวเองเรียนรู้ bashscripting กับความน่าเกลียดทั้งหมด=และ `= 'ความแตกต่างและนิสัยใจคอ :) ทำไมพวกเขาจะไม่แทนที่ด้วยภาษาหลามเหมือน syntaxed ...
บอริส Burkov

เฮ้ฉันรู้อะไรน่ะ! คุณสามารถเพิ่มสัญลักษณ์การขึ้นบรรทัดใหม่ให้กับแต่ละบรรทัดใหม่ที่คุณพิมพ์และจะไม่ท่วมหน้าจอ แต่จะเขียนทับบรรทัดก่อนหน้า
Boris Burkov

นั่นคือเหตุผลที่ลงท้ายด้วยprintf \rและสิ่งที่เกิดขึ้นถ้าคุณทำหรือecho -ne "$I\r" print -n "$I\r":) ฉันใช้printfเพราะมันเป็นค่าเริ่มต้นที่จะไม่พิมพ์บรรทัดใหม่ในตอนท้ายดังนั้น\rแค่ย้ายกลับไปที่จุดเริ่มต้น การประยุกต์ใช้เสียงก้องไม่สนับสนุน-eหรือ-nโต้แย้ง
dannysauer

1
นอกจากนี้ยังทำงานกับรุ่น pdksh ที่ OpenBSD ใช้สำหรับ / bin / sh
kurtm

1
+1 แม้ว่าจะถูกต้องอย่างแน่นอนคุณควรเปลี่ยนreadเป็นread -r(เพราะมิฉะนั้นแบ็กสแลชที่ท้ายบรรทัดจะยุ่งกับการนับ) อนึ่งด้วยการทำงานเล็กน้อยสิ่งนี้สามารถปรับให้แสดงบรรทัดล่าสุดของผลลัพธ์ซึ่งอาจเป็นประโยชน์สำหรับบางคำสั่ง
ruakh

7

นี่เป็นแนวคิดคร่าวๆ แต่คุณสามารถใช้pvคำสั่งเพื่อนับจำนวนบรรทัดขณะที่พวกเขากำลังผ่านไปและแสดงให้เห็นบนหน้าจอ pvมันมีสวิตช์มากมายที่มี-lสวิตช์ซึ่งนับแต่ละบรรทัดเมื่อผ่านไป

ตัวอย่าง

ที่นี่ฉันใช้เวลาสักครู่เพื่อจำลองบางไฟล์จากเอาต์พุต SVN ของคุณ

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

มันจะเขียนทับบรรทัดเอาท์พุทแบบนี้:

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]

ฉันไม่รู้จัก pv ไชโยสำหรับการเรียนรู้สิ่ง!
dannysauer

@dannysauer - pv คุ้มค่าที่จะใช้เวลาในการเรียนรู้มันช่วยให้ทุกสิ่งที่ผ่านไปป์จะถูกประเมินและแสดงผล
slm

ฉันติดตั้งมันหลังจากที่ฉันอ่านความคิดเห็นและได้เล่นกับมัน สิบแปดปีที่ใช้ Linux และยังมีสิ่งใหม่ ๆ ให้ค้นหาอยู่เสมอ :)
dannysauer

0

คุณสามารถเรียกใช้คำสั่งของคุณในพื้นหลังเป็นงานและเปลี่ยนเส้นทาง stdout (และ stderr เป็นทางเลือก) ไปยัง logfile: command > logfile &โดยที่&กำหนดงาน (ถ้า stderr ด้วยให้พูด&>แทน>)

แล้วคุณสามารถใช้ยูทิลิตี้ wordcount การนับจำนวนของเส้นใน logfile wc -lของคุณด้วย

ในการแสดงการเปลี่ยนแปลงสถานะในหนึ่งบรรทัดที่เปลี่ยนแปลงแบบไดนามิกคุณสามารถใช้สิ่งที่ชอบwhile true; do echo -en '\r'; wc -l logfile; sleep 1; doneแต่ฉันไม่สามารถบังคับให้ทุบตีเพื่อวาด\rการขึ้นบรรทัดใหม่เพื่อฆ่าเนื้อหาของบรรทัดก่อนหน้า

ดูคำถามนี้มันเกือบจะซ้ำกัน: /programming/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash


1
แต่เขาต้องการจอแสดงผลแบบเรียลไทม์ที่เพิ่มขึ้นเรื่อย ๆ ซึ่งไม่ใช่สิ่งที่ wc ทำ
kurtm

@ kurtm เอ๊ะสิ่งที่เขาต้องการอีกมากคือการไม่ให้หน้าจอของเขาเต็มไปด้วยผลของการprintf/print/echoแนะนำโดยแดนนี่ :) แน่นอนเขาสามารถใช้lessแต่ฉันคิดว่าเขาสามารถพูดได้wc -l logfileทุกครั้งที่เขาใจร้อน ฉันคิดว่าการเล่นกับncursesหรือล้างหน้าจอเป็นสิ่งที่เกินความจริงที่นี่
Boris Burkov

ก็ใช่ เขาไม่ต้องการให้มันท่วม แต่เขาต้องการทราบความก้าวหน้ามิฉะนั้นเขาก็สามารถใช้ - เงียบ
kurtm

@kurtm ดูการอัปเดต: คุณสามารถช่วยในการดีบักecho -e 'r'คำสั่งของฉันได้หรือไม่ ควรลบเนื้อหาที่พิมพ์ก่อนหน้าของบรรทัดเพื่อให้มีการเปลี่ยนแปลงแบบไดนามิก แต่ฉันไม่สามารถบังคับให้ทำเช่นนั้น :(
Boris Burkov

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