Komutu xterm başlık çubuğunda görüntüle


23

Bash Prompt şu anda aşağıdaki sıralamayı kullanarak xterm başlık çubuğunu ayarlıyor:

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

Geçerli komutu başlık çubuğunda görüntülemek için kolay bir yol var mı. Örneğin, kullanarak bir dosyayı tararsam tail -f foo.log, başlık çubuğumun söylemesini istiyorum tail -f foo.log.

Yanıtlar:


16

Temel olarak, ihtiyacınız:

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

senin .bashrcveya benzerinin sonunda . Bunu çözmek için biraz zaman aldı - daha fazla bilgi için cevabımı burada bakın :)


Bu çözüm Simon için teşekkürler! Ancak, bunu .bashrcbenim kabuğumdaki her komuttan sonra eklerken bu çıktıyı alıyorum 0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}. Ben hiç tuzak komutu atayarak bu çıktıyı bastırmak olabileceğini varsayıyoruz PS1? Ancak, PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGçalışmıyor. Hataya yol açar bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found.
orschiro

BTW, daha önce stackoverflow.com/questions/48407130/… alanını araştırdım , bu tavsiyenin uygulanması sonucu muhtemelen sordum. Tuzak stdr'a değil, doğrudan TTY'ye yazmalı.
Charles Duffy

1
@ orchiro, trapkomutu PS1'e atamamak için ayrı bir komut olarak çalıştırma tavsiyesi .
Charles Duffy

12

( Bu SU cevabından ilham alındı )

Birkaç bash hilesi birleştirebilirsiniz:

  • Bir DEBUG sinyali yakalarsanız, her komut çalıştırılmadan önce işleyici çağrılır.
  • Değişken $BASH_COMMANDo anda execut komutunu tutar

Bu nedenle, DEBUG tuzağını açın ve işleyicinin ünvanı şu şekilde ayarlamasını sağlayın $BASH_COMMAND:

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

Bu, başka bir şey değişinceye kadar başlığı değiştirmeye devam edecektir, ancak $PS1aynı kaldığı sürece sorun olmayacak - bir komutu başlattığınızda, DEBUG işleyicisi başlık çubuğunu değiştirir ve komut bittiğinde bash yeni bir çizer istemi ve başlık çubuğunu tekrar sıfırlar.

Burada bulunan yararlı bir ipucu (aynı zamanda SU cevabının nereden geldiği) şunları içermelidir:

set -o functrace

Bu, bash DEBUG tuzağını, başladığın alt kabuklara yayar; aksi takdirde başlık çubuğu bunlarda değişmeyecek


Ha! tam olarak aynı anda aynı cevap! Alt kabukların işlenmesi için +1, fakat boru sorununa herhangi bir cevabınız var mı? (SO sorusuna bağlantımı gör)
simon

İşe yaramazssh
abyss.7

Ayrıca "sekme" üzerindeki tamamlamayı "öldürür"
abyss.7

BTW, daha önce stackoverflow.com/questions/48407130/… alanını araştırdım , bu tavsiyenin uygulanması sonucu muhtemelen sordum. Tuzak stdr'a değil, doğrudan TTY'ye yazmalı.
Charles Duffy

/dev/ttyStderr yerine yönlendirmek daha iyi olmaz mıydı ?
Aaron Digulla

2

Etrafımda çeşitli görevlerden kendi çözümümle çalıştım. Bu kullanıcı, ana bilgisayar adı, pwd, tty ve şu anda yürütülen komutu (bash için) içeren bir başlık oluşturur.

Bu şuna benziyor (yürütülmekte olan hiçbir komut yok):

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

Ve bunun gibi (bir komutu yürütmek):

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

.Bashrc'da bir yerde, PS1'i genişlettim:

# 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\]"

History 1 ve trap komutunu kullanarak geçerli komutu ekler :

# 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

İhtiyaçlarınızı kabul etmekte özgürsünüz.


BTW, daha önce stackoverflow.com/questions/48407130/… alanını araştırdım , bu tavsiyenin uygulanması sonucu muhtemelen sordum. Tuzak stdr'a değil, doğrudan TTY'ye yazmalı.
Charles Duffy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.