Simpan input bash di baris atas layar

12

Saya ingin menyimpan bashinput command prompt di bagian atas layar sehingga output dari perintah yang lebih lama didorong ke bawah daripada ke atas.

Bagaimana saya bisa mencapai ini?

Tom Price
sumber
6
Jadi, jika Anda catsebuah file, urutannya akan terbalik?
kekacauan
Tidak, tapi saya ingin potongan output didorong ke bawah
Tom Price
1
bashtidak dapat melakukan ini, karena bashbahkan tidak tahu tentang posisi layar: itu hanya menulis ke file keluaran. Anda akan memerlukan terminal emulator yang tahu tentang bashprompt interaktif untuk mengetahui kapan harus mengatur ulang kursor dan kapan harus menggulir jendela.
chepner
Terima kasih @chepner, saya meninjau kembali masalah ini dan komentar Anda membuat saya melihat di luar bash dan mulai melihat seluruh tumpukan tampilan. Saya ingin tetap berada dalam konsol virtual berbasis teks (yaitu tidak ada X Windows) jadi saya akan menghindari emulator terminal untuk saat ini, tetapi untuk sesi GUI saya, saya pasti akan membahasnya. Jika ada orang yang menemukan pertanyaan ini, tebakan saya berkaitan dengan tty dan saat ini saya sedang mencari inspirasi ... linusakesson.net/programming/tty
Tom Price

Jawaban:

7

Tambahkan baris ini ke .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

bashmemiliki PROMPT_COMMAND , yang memegang perintah akan dieksekusi sebelum bashshow prompt. Di sini kita mengaturnya untuk berfungsi prompt_on_top, yang menggunakan tput untuk mengatur kursor di bagian atas layar.

bashjuga memiliki cara untuk mengeksekusi perintah sebelum mengeksekusi perintah apa pun, menggunakan perangkap untuk menangani sinyal DEBUG. Di sini kita mengaturnya untuk berfungsi pre_cmd, yang akan menghapus layar lama, dan tidak melakukan apa-apa jika kita menyelesaikannya ( COMP_LINE tidak kosong) atau menjalankan perintah BASH_PROMPT.


Ada batasan dengan pendekatan ini, jika output perintah terlalu panjang dan sesuai di layar, maka output akan ditimpa oleh prompt_on_toptindakan. Dalam hal ini, Anda perlu menyalurkan output ke pager untuk membaca seluruh output.

cuonglm
sumber
1
Terima kasih atas jawaban Anda yang dijelaskan dengan baik, ada banyak bagi saya untuk membaca dan belajar. Saya telah menguji skrip Anda, dan saat ini secara efektif menghapus keluaran lama dari layar di antara perintah. Saya ingin menyimpan output sebelumnya di layar, di bawah prompt, dan memilikinya sehingga output baru dimasukkan antara prompt dan output lama, karena itu mendorong output lama ke layar.
Tom Price
Bagi mereka yang datang ke sini melalui pencarian web, kode ini github.com/swirepe/alwaysontop juga "menjaga bash prompt Anda di bagian atas layar", ditambah beberapa fungsi lainnya. Namun tidak menjawab pertanyaan asli: output perintah yang lebih lama dihapus seperti dengan kode cuonglm.
WillC
Kelemahan lain dari solusi ini, adalah bahwa Anda tidak memiliki umpan balik tentang perintah apa yang terakhir kali dieksekusi. Artinya, cat fileakan menampilkan filekonten, tetapi Anda tidak mendapatkan umpan balik langsung dari perintah yang tepat dieksekusi. Idealnya prompt akan diikuti dengan versi + dieksekusi yang tidak diperluas dari perintah yang dijalankan, diikuti dengan std ouput.
psychoslave