Tampilkan perintah dalam bilah judul xterm


23

Prompt Bash Saya saat ini sedang mengatur bilah judul xterm menggunakan urutan berikut:

PS1='\033]0;\u@\h>\w\007'

Apakah ada cara mudah untuk menampilkan perintah saat ini di batang judul. Sebagai contoh, jika saya menggunakan file tailing tail -f foo.log, saya ingin titlebar saya katakan tail -f foo.log.

Jawaban:


16

Pada dasarnya, Anda perlu:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG

di akhir Anda .bashrcatau yang serupa. Butuh waktu beberapa saat untuk menyelesaikannya - lihat jawaban saya di sini untuk informasi lebih lanjut :)


Terima kasih atas solusi simon ini! Namun, ketika menambahkan ini ke saya .bashrcsetelah setiap perintah di shell saya, saya mendapatkan output ini 0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}. Saya berasumsi bahwa saya dapat menekan output ini dengan menetapkan perintah trap PS1? Namun, PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGtidak berhasil. Itu mengarah ke kesalahan bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found.
orschiro

BTW, saya baru saja memasukkan stackoverflow.com/questions/48407130/… , bertanya mungkin karena saran ini diterapkan. Perangkap harus menulis ke stderr atau ke TTY secara langsung, bukan ke stdout.
Charles Duffy

1
@orschiro, saran untuk menjalankan trapperintah sebagai perintah terpisah , bukan untuk menetapkannya ke PS1.
Charles Duffy

12

(Terinspirasi oleh jawaban SU ini )

Anda dapat menggabungkan beberapa trik pesta:

  • Jika Anda menjebak sinyal DEBUG, pawang dipanggil sebelum setiap perintah dieksekusi
  • Variabel $BASH_COMMANDmemegang perintah yang sedang dieksekusi

Jadi, jebak DEBUG dan minta pawang mengatur judul menjadi $BASH_COMMAND:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG

Ini akan membuat judul diubah sampai sesuatu yang lain mengubahnya, tetapi selama Anda $PS1tetap sama itu tidak akan menjadi masalah - Anda memulai perintah, penangan DEBUG mengubah bilah judul, dan ketika perintah selesai bash menarik yang baru meminta dan mengatur ulang bilah judul Anda lagi.

Tip berguna yang ditemukan di sini (juga dari mana jawaban SU berasal) adalah untuk memasukkan:

set -o functrace

Ini akan membuat bash menyebarkan perangkap DEBUG ke sembarang subkulit yang Anda mulai; jika batang judul tidak akan diubah di dalamnya


Ha! jawaban yang sama tepat pada waktu yang sama! +1 untuk menangani subkulit, tetapi apakah Anda memiliki jawaban untuk masalah pipa? (lihat tautan saya ke pertanyaan SO)
simon

Tidak berhasilssh
abyss.7

Juga "membunuh" penyelesaian pada "tab"
abyss.7

BTW, saya baru saja memasukkan stackoverflow.com/questions/48407130/… , bertanya mungkin karena saran ini diterapkan. Perangkap harus menulis ke stderr atau ke TTY secara langsung, bukan ke stdout.
Charles Duffy

Bukankah lebih baik mengarahkan ke /dev/ttybukan stderr?
Aaron Digulla

2

Saya mengerjakan solusi saya sendiri dari berbagai posting di sekitar. Ini menciptakan judul yang berisi perintah pengguna, hostname, pwd, tty, dan yang saat ini dieksekusi (untuk bash).

Ini terlihat seperti ini (tidak ada perintah yang dijalankan):

.:[user@hostname:/home/user][pts/10]:.

Dan seperti ini (menjalankan perintah):

.:[user@hostname:/home/user][pts/10] {tail -F /var/log/syslog}:.

Di suatu tempat di .bashrc, saya memperpanjang PS1:

# set the terminals title. This is the "post-command" part,
# need to use a trap for pre-command (to add the command line to the title)
PS1+="\[\033]2;.:[\u@\h:\$PWD] [$(tty | cut -b 6-)]:.\007\]"

Tambahkan perintah saat ini, menggunakan histori 1 dan perangkap :

# set a fancy title (this is pre-command, in PS1 is after-command (to reset command)
trap 'echo -ne "\033]2;.:[${USER}@${HOSTNAME}:${PWD}] [$(tty | cut -b 6-)] {$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")}:.\007"' DEBUG

Jangan ragu untuk beradaptasi dengan kebutuhan Anda.


BTW, saya baru saja memasukkan stackoverflow.com/questions/48407130/… , bertanya mungkin karena saran ini diterapkan. Perangkap harus menulis ke stderr atau ke TTY secara langsung, bukan ke stdout.
Charles Duffy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.