2009-11-06 11 views
44

Czy można ustawić Screen-Title przy użyciu skryptu powłoki?Ustaw tytuł ekranu z powłoki Shellscript

myślałem o czymś jak wysyłanie klawisze Strg+A Shift-A Name <Enter>

Szukałem przez około godzinę, w jaki sposób emulować naciśnięć klawiszy w skrypcie, ale nie znaleźliśmy odpowiedź.

Dzięki za pomoc!

Beerweasle

Odpowiedz

43

Można ustawić tytuł ekran/xterm, stosując następujące linie:

#!/bin/bash 

mytitle="Some title" 
echo -e '\033k'$mytitle'\033\\' 

[Update] - na prośbę jestem w tym również rozwiązania zaproponowanego przez @Espo poniżej:

W zależności od wersji xterma lub dystrybucji linux powyższa linia może, ale nie musi działać, i możesz wypróbować ustawienia domyślne xterm:

#!/bin/bash 

mytitle="Some title" 
echo -e '\033]2;'$mytitle'\007' 

Aby uzyskać więcej informacji na temat szczegółów, zobacz: http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#s3 lub odszukaj odpowiedź @Espo poniżej.

+9

to nie działa na mnie. Testowałem w xterm i w Konsole (od KDE4). '" \ e] 2; tytuł \ "" działał. –

+1

To nie zadziała, jeśli włączona jest opcja "Allow SendEvents", która wydaje się być domyślna w ostatnich wersjach ubuntu: https://bugs.launchpad.net/ubuntu/+source/xterm/+bug/495733 –

+0

Myślę, że możemy może zgodzić się, że nie ma rozwiązania typu catch-all (westchnienie). najlepszym przykładem jest tutaj Konsole, które * może * użyć \ 033k (lub \ ek), ale woli \ e] 2; (lub na odwrót .. jako \ e] 2; wydaje się być domyślnym xtermem) – Shirkrin

7
set_screen_title() 
{ 
    echo -ne "\ek$1\e\\" 
} 
19

Od http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#s3

sekwencje xterm ewakuacyjne

okienne i ikona tytuły mogą być zmieniane w xterm uruchomiony za pomocą XTerm sekwencje. Poniższe sekwencje są użyteczne w tym względzie:

  • ESC]0;stringBEL - Ustawienie nazwy ikony i tytułu okna ciąg
  • ESC]1;stringBEL - Ustaw nazwę ikona ciąg
  • ESC]2;stringBEL - zestaw tytułu okna ciąg

gdzie ESC jest znakiem ucieczki (\ 033), a BEL jest znakiem dzwonka (\ 007).

Drukowanie jednej z tych sekwencji w ciągu spowoduje zmianę tytułu ikony okna lub .

Uwaga: te sekwencje odnoszą się do większości pochodnych xterm , takich jak nxterm, kolor-xterm i rxvt. Inne typy terminali często używają różnych ucieczek; patrz dodatek do przykładów. Dla pełnej listy sekwencji wyjściowych xterm dla znajduje się plik ctlseq2.txt, który ma numer z rozkładem xterm lub xterm.seq, który jest dostarczany wraz z dystrybucją rxvt .

Drukowanie sekwencje

tych informacji, które stały przez cały okres tej powłoki, takie jak hosta i nazwę użytkownika, będzie wystarczy, aby po prostu echo ciąg w pliku rc powłoki ucieczka :

echo -n "\033]0;${USER}@${HOST}\007" 

powinna produkować tytuł jak nazwa_użytkownika @ hostname, zakładając skorupy zmiennych $ USER i $ gospodarzem ponownie ustaw poprawnie . Wymagane opcje dla echa mogą się różnić w zależności od powłoki (zobacz przykłady poniżej: ).

Dla informacji, które mogą ulec zmianie w trakcie trwania powłoki, takich jak aktualna katalogu roboczego, te ucieczki naprawdę muszą być stosowane za każdym razem Symbol zachęty. W ten sposób ciąg jest aktualizowana przy każdym poleceniu wydać i mogą śledzić informacji, takich jak aktualny katalog roboczy , podając nazwę użytkownika, nazwę hosta itp Niektóre muszle zapewniają specjalne funkcje w tym celu, niektóre nie, a my należy wstawić sekwencje tytułu bezpośrednio do ciągu podpowiedzi. Ten jest zilustrowany w następnej sekcji.

+0

Ekran wydaje się jednak zignorować to całkowicie, chociaż znalazłem fragmenty przy użyciu obu "\ ekTITLE \ e \\" i "\ e] 0; TYTUŁ \ a" (ten ostatni bez żadnego użycia najwyraźniej). Być może jest to związane z ustawieniem "hardstatus" ekranu - używam tam: hardstatus string "SCREEN @% H:% -n -% t" (% t odnosi się do tytułu okna) – blueyed

3

Można ekran również zadzwonić i poinformować go ustawić tytuł:

screen -X title "new title" 

Jeśli w oknie ekranu, to będzie ustawić nazwę tego okna. Jeśli nie jesteś na ekranie, ustawi on ostatnio otwieraną nazwę okna.

1

Aby dodać odpowiedź espo za sekwencje xterm ewakuacyjne mogą być również stosowane do atakujących PS1 zmienna

ESC]0;stringBEL -- Set icon name and window title to string 
ESC]1;stringBEL -- Set icon name to string 
ESC]2;stringBEL -- Set window title to string 

Przykład

PS1='\e]0;string\a' 
10

następujące są inne sposoby, aby skrypt zmianę nazwy tytułów ekranu :

Dodanie następujących ustawień do .ssh/config powoduje automatyczne ustawienie tytułu ekranu po zalogowaniu się do syst. em za pomocą SSH:

Host * 
    PermitLocalCommand yes 
    LocalCommand [ "$TERM" == 'screen' ] && echo -ne "\033k%h\033\\" 

Zamiast %h, który reprezentuje nazwę hosta urządzenia łączysz się, można użyć %n, która jest rzeczywista nazwa/alias użyte do połączenia z komputerem.

UWAGA: Potrzebujesz OpenSSH> = v5.1, aby móc używać parametrów LocalHost% n i% h. Sprawdź 'man ssh_config', aby uzyskać więcej informacji o LocalCommand.

Aby automatycznie przywrócić tytuł, z powrotem do danego hosta localhost, po zamknięciu sesji SSH, można dodać sekwencję ucieczki do ciebie szybka zmienna PS1 w .bashrc:

export PS1='you_favorite_PS1_here' 
if [ "$TERM" == 'screen' ]; then 
    export PS1=${PS1}'\[\033k\h\033\\\]' 
fi 

te sztuczki są jest szczególnie przydatna, gdy używasz konfiguracji .screenrc, która pokazuje, na której "zakładce" ekranu aktualnie pracujesz. Dodaj coś takiego do .screenrc uzyskać tej pracy:

caption always "%{= kY}%-w%{= Yk}%n %t%{-}%+w%{ kG} %-= @%H - %LD %d %LM - %c" 
+0

Używanie 'LocalCommand echo "$ TERM" | grep -q 'screen' && echo -ne "\ 033k% n \ 033 \\" ' będzie również działał w tcsh –

8

Spróbuj poniższe polecenia, nie trzeba edytować żadnego pliku lub konfiguracji, jak ~/.bashrc, Może być używany w czasie wykonywania.

Ustaw statyczny tekst jako tytuł: (Mój tytuł)

export PS1='\[\e]0;My Title\a\]${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$ ' 

Ustaw local/zmienna globalna jako tytuł: ($ USER)

export PS1='\[\e]0;$USER\a\]${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$ ' 

Ustaw wyjście polecenia jako tytuł : (nazwa hosta)

export PS1='\[\e]0;`hostname`\a\]${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$ ' 

Ustaw domyślne (Przywróć z tyłu):

export PS1='\[\e]0;\[email protected]\h: \w\a\]${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$ ' 
+0

Dokładnie to, co chciałem dzięki – Eun

+0

To zmienia monit. – developerbmw

0
# add the following in your ~/.bashrc or ~/.bash_profile 
PROMPT_COMMAND='printf "\033]0;%[email protected]%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' 

lub nawet lepiej skopiować całą koncepcję do dostosowywania configs bash między wieloma hostami z here

Powiązane problemy