เก็บอินพุต bash ไว้ที่บรรทัดบนสุดของหน้าจอ


12

ฉันต้องการเก็บbashอินพุตพรอมต์คำสั่งที่ด้านบนของหน้าจอเพื่อให้เอาท์พุทจากคำสั่งเก่าถูกดันลงมามากกว่าขึ้น

ฉันจะบรรลุสิ่งนี้ได้อย่างไร


6
ดังนั้นถ้าคุณcatไฟล์มันจะกลับคำสั่ง?
ความสับสนวุ่นวาย

ไม่ แต่ฉันต้องการให้ชิ้นส่วนของผลผลิตลดลง
ราคาทอม

1
bashทำสิ่งนี้bashไม่ได้เพราะไม่รู้เกี่ยวกับตำแหน่งหน้าจอ: เพียงเขียนไปยังไฟล์เอาต์พุต คุณจะต้องมีเทอร์มินัลอีมูเลเตอร์ที่ทราบเกี่ยวกับbashการโต้ตอบแบบโต้ตอบเพื่อทราบว่าเมื่อใดที่จะรีเซ็ตเคอร์เซอร์และเมื่อต้องการเลื่อนหน้าต่าง
chepner

ขอบคุณ @chepner ฉันกำลังทบทวนปัญหานี้อยู่และความคิดเห็นของคุณทำให้ฉันดูนอกจากการทุบตีและเริ่มดูสแต็กการแสดงผลทั้งหมด ฉันต้องการอยู่ในคอนโซลเสมือนที่ใช้ข้อความ (เช่นไม่มี Windows) ดังนั้นฉันจะหลีกเลี่ยงเทอร์มินัลอีมูเลเตอร์ในตอนนี้ แต่สำหรับเซสชัน GUI ของฉันฉันจะมองอย่างนั้น ในกรณีที่ทุกคนเจอคำถามนี้ฉันเดาว่ามันเกี่ยวข้องกับ tty และฉันกำลังมองหาแรงบันดาลใจที่นี่ ... linusakesson.net/programming/tty
Tom Price

คำตอบ:


7

เพิ่มบรรทัดเหล่านี้ใน.bashrc:

prompt_on_top() {
  tput cup 0 0
  tput el
  tput el1
}

pre_cmd() {
  if [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] || [ -n "$COMP_LINE" ]; then
    return
  fi
  printf "\33[2J"
}

PROMPT_COMMAND="prompt_on_top"
trap 'pre_cmd' DEBUG

bashมีPROMPT_COMMANDซึ่งถือคำสั่งจะถูกดำเนินการก่อนที่จะbashแสดงพรอมต์ ที่นี่เราตั้งเป็นฟังก์ชั่นprompt_on_topซึ่งใช้tputเพื่อตั้งเคอร์เซอร์ที่ด้านบนของหน้าจอ

bashนอกจากนี้ยังมีวิธีการดำเนินการคำสั่งก่อนที่จะดำเนินการคำสั่งใด ๆ โดยใช้กับดักDEBUGที่จะจัดการกับสัญญาณ ที่นี่เราตั้งค่าให้ฟังก์ชั่นpre_cmdซึ่งจะล้างหน้าจอเก่าและไม่ทำอะไรเลยถ้าเราทำเสร็จ ( COMP_LINEไม่ว่างเปล่า) BASH_PROMPTหรือคำสั่งในการทำงาน


มีข้อ จำกัด เกี่ยวกับวิธีการนี้หากเอาต์พุตคำสั่งยาวเกินไปพอดีในหน้าจอเอาต์พุตจะถูกแทนที่โดยprompt_on_topการดำเนินการ ในกรณีนี้คุณต้องไพพ์เอาต์พุตไปยังเพจเจอร์เพื่ออ่านเอาต์พุตทั้งหมด


1
ขอบคุณสำหรับคำตอบที่ได้รับการอธิบายมาเป็นอย่างดีฉันมีหลายอย่างที่ต้องอ่าน ฉันได้ทดสอบสคริปต์ของคุณและในขณะนี้สคริปต์จะล้างผลลัพธ์เก่าจากหน้าจอระหว่างคำสั่งอย่างมีประสิทธิภาพ ฉันต้องการเก็บเอาท์พุทก่อนหน้านี้ไว้บนหน้าจอด้านล่างของพรอมต์และมีมันเพื่อให้เอาท์พุทใหม่ถูกแทรกระหว่างพรอมต์และเอาท์พุทเก่าดังนั้นผลักดันเอาท์พุทเก่าลงบนหน้าจอ
Tom Price

สำหรับผู้ที่มาที่นี่ผ่านการค้นหาเว็บรหัสนี้github.com/swirepe/alwaysontopยัง "ให้ bash พรอมต์ของคุณที่ด้านบนของหน้าจอ" รวมถึงฟังก์ชั่นอื่น ๆ ไม่ตอบคำถามเดิมแม้ว่า: ผลลัพธ์คำสั่งเก่าจะถูกลบเช่นเดียวกับรหัสของ cuonglm
WillC

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