Bash Prompt ด้านล่างผลลัพธ์ - หางบันทึกประวัติความเป็นมา


15

ฉันเคยทำงานให้กับ บริษัท ที่มีเชลล์แบบกำหนดเองสำหรับการจัดการหนึ่งในผลิตภัณฑ์ของตนที่ใช้งานบน Linux และฉันต้องการจำลองคุณลักษณะสำคัญของเชลล์นี้

งานทั้งหมดทำโดยกระบวนการพื้นหลังและผลลัพธ์จากบันทึกแสดงต่อผู้ใช้ที่เชื่อมต่อทั้งหมด

บันทึกจะอยู่ในพื้นหลังกับเชลล์ของคุณและบรรทัดพรอมต์จะอยู่ที่ด้านล่างเสมอ

สำหรับเช่น

Log line 1
Log line 2
Log line 3
![ROOT@PRODUCT51-LIVE]:~/ #

วิธีที่ฉันพยายามทำกับ bash คือการเริ่ม tail tail ในไฟล์. bashrc ของผู้ใช้ แต่เมื่อ output จากคำสั่งถูกส่งไปยัง stdout - มันมาใน bash prompt เช่น

![ROOT@PRODUCT51-LIVE]:~/ #Log line 1
Log line 2
Log line 3

และผู้ใช้จะต้องกด Enter หรือCtrlCสำหรับบรรทัดแจ้งให้สะอาด

ฉันไม่มีแนวคิดเกี่ยวกับวิธีทำให้พรอมต์กระโดดไปที่ด้านล่างสุดของผลลัพธ์เสมอและฉันคิดว่าฉันใช้คำศัพท์ที่ผิดเพื่อค้นหาสิ่งใดใน Google เนื่องจากฉันไม่มีโชค - ไม่มีใครรู้วิธีทำสิ่งนี้ ด้วยทุบตี?


1
คุณต้องการอัพเดทผลลัพธ์ทันทีหรือเมื่อคุณได้รับพรอมต์ใหม่
ahilsend

ทันใดดังนั้นมันจึงเหมือนกันที่สุดเท่าที่จะทำได้เพียงแค่เรียกใช้ "tail -f" แต่มีพรอมต์ที่ด้านล่าง
iamacarpet

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

ในกรณีของพวกเขาคำสั่งที่เรียกใช้จะทำให้เกิดผลลัพธ์เพียงอย่างเดียวผ่านกระบวนการพื้นหลังไม่ใช่ด้วยตัวเองดังนั้นจึงไม่ใช่ปัญหา ในกรณีนี้เมื่อเราได้วิธีการแก้ปัญหาที่ให้ผลที่ต้องการฉันคิดว่ามันเป็นกรณีของการเล่นและการดูว่าผลผลิตที่ได้รับไม่ดีจะผสมกันบนพื้นฐานของการนำไปใช้งาน
iamacarpet

1
จากนั้นฉันขอสนับสนุนข้อเสนอแนะของการใช้หน้าจอหรือ tmux เอาท์พุทจะไม่ปะปนกันหรือแย่งพื้นที่หน้าจอและคุณสามารถปรับขนาดหน้าต่าง (เลื่อนตัวแยก) และเลื่อนพวกเขาอย่างอิสระ หากการคัดค้านของคุณคือบรรทัดส่วนหัว / ท้ายกระดาษ / สถานะเป็น "หนัก" ก็มีความสามารถในการกำหนดค่า ไม่มีล้อใหม่
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

คำตอบ:


1

ต่อไปนี้เป็นสิ่งที่คุณต้องการโดยไม่ต้องใช้ tmux หรือหน้าจอหรือโปรแกรมอื่น ๆ เก็บพรอมต์ที่ด้านล่าง แทนที่ "/ var / log / cron" ด้วยไฟล์อะไรก็ตามที่คุณต้องการ:

#!/bin/bash 
L=$(tput lines)
L1=${L}
(( L1-- ))
C=$(tput cols)
tput cup ${L} 0
tail -f /var/log/cron | while read line; do 
  tput sc
  printf "\e[1;${L1}r\e[${L1};${C}f" 
  echo; echo ${line}
  printf "\e[1;${L}r" && tput rc
done

กุญแจสู่สิ่งนี้คืออักขระควบคุม ANSI สำหรับเทอร์มินัล โดยเฉพาะอย่างยิ่งคำสั่ง "\ e [x; y" ซึ่งตั้งค่าพื้นที่เลื่อนใหม่ ดังนั้นเมื่ออ่านแต่ละบรรทัดของไฟล์บันทึกแล้วบรรทัดด้านล่างในหน้าต่างจะถูกแยกออกจากพื้นที่ที่เลื่อนได้บรรทัดจากไฟล์บันทึกจะถูกแทรกจากนั้นจะเพิ่มส่วนล่างเข้าไปอีก


ขอบคุณ Michael ที่ทำงานได้อย่างสวยงาม =] - ฉันมีปัญหาบางครั้งเกี่ยวกับเรื่องนี้ที่คุณกำลังพิมพ์ขณะที่มีการเลื่อนสายบันทึกจำนวนมากคุณไม่สามารถ backspace ข้อความทั้งหมดในบรรทัดคอนโซลของคุณ (ฉันกำลังทดสอบด้วย บันทึก apache ที่ไม่ว่าง) แต่สำหรับสิ่งที่ฉันต้องการใช้เพื่อมันไม่น่าจะมีปัญหา
iamacarpet

@iamacarpet ยอดเยี่ยม ดีใจที่ได้ผลกับคุณ
Michael Martinez

11

คำตอบคือหน้าจอหรือใช้ tmux

ฉันจะอธิบายวิธีที่คุณสามารถกำหนดค่าโดยใช้หน้าจอ

1) ติดตั้งหน้าจอโดยใช้ apt-get install screenบน Ubuntu / Debian หรือyum install screenRedHat derivates

2) screen -S shell_and_logs

3) จากนั้นกดCtrl+ aตามด้วยS(เมืองหลวง S)
หน้าจอแนวนอนจะปรากฏขึ้น

4) กดCtrl+ aตามด้วยTAB
สิ่งนี้จะข้ามไปที่หน้าต่างแยกที่สอง

5) สร้างหน้าต่างใหม่ที่นี่เพื่อให้คุณได้รับคำสั่งโดยกดCtrl+ aปล่อยปุ่มจากนั้นกดc

6) คุณสามารถปรับขนาด windo ที่สองโดยกดCtrl+ aจากนั้นพิมพ์:resizeหลังจากนั้น Lines:จะปรากฏขึ้น ป้อนจำนวนบรรทัดที่คุณต้องการแสดง

7) ในที่สุดคุณสามารถสลับระหว่าง windows ด้วย Ctrl+ aตามด้วยTAB

ดูตัวอย่างด้านล่าง


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

@iamacarpet tail -F /var/log/messages &เป็นอีกวิธีหนึ่งในการแสดงข้อความถึงคุณเมื่อมีบางสิ่งเปลี่ยนแปลงเช่นเมื่อค้นพบความล้มเหลวในการเข้าสู่ระบบหรือเมื่อบริการบางอย่างมีปัญหา อย่างไรก็ตามมันไม่เหมาะเนื่องจากมันจะทำให้เปลือกโต้ตอบของคุณยุ่งเหยิง
Valentin Bajrami

ใช่นั่นคือสิ่งที่ฉันถาม - วิธีการทำโดยไม่ทำให้เปลือกแบบโต้ตอบยุ่งเหยิง - นั่นคือสิ่งที่พวกเขาได้ทำบนเปลือก บริษัท - แต่ก็ดีที่ไม่ต้องเขียนเชลล์ตั้งแต่เริ่มต้น เพื่อให้บรรลุมัน
iamacarpet

1
@iamacarpet ยังมีเครื่องมืออื่น ๆ อีกมากมายนอกเหนือจากนี้screenและtmuxสามารถทำสิ่งนี้ได้ตัวอย่างเช่นBSD บางอันมีwindowคำสั่ง ให้ทางเลือกแม้ว่าฉันจะแนะนำวิธีแก้ปัญหานี้มากกว่าทั้งเปลือกที่กำหนดเองหรือตัวเลือกอื่น ๆ เนื่องจากความยืดหยุ่น มันอาจจะไม่โปร่งใสให้กับผู้ใช้ แต่พวกเขาจริงๆจะไม่ทราบความแตกต่างและผู้ใช้ไฟฟ้า / sysadmins screenจะสามารถที่จะใช้ความยืดหยุ่นพิเศษที่นำเสนอโดย
voretaq7

@iamacarpet t=$(mktemp); printf '%s\n' 'screen tail -F /var/log/messages' split focus screen > "$t"; screen -S screenname -c "$t"ใส่ไว้ในสคริปต์และเรียกใช้ทุกครั้งที่คุณต้องการ ขอบคุณ geirha สำหรับสิ่งนี้ที่ #bash @ irc.freenode.org
Valentin Bajrami
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.