The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Раздел полезных советов: Динамическое изменение заголовков о..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Динамическое изменение заголовков о..."  +/
Сообщение от auto_tips (??) on 28-Июн-10, 09:53 
Как известно, screen умеет динамически менять заголовки окон, исследуя каждую выводимую строку приложения на наличие esc-k. Вот этого в .bashrc достаточно, чтобы научить screen менять заголовок в зависимости от запущенного приложения:

   if [[ "$TERM" == "screen" ]]; then
       SCREENTITLE='\[\ek\e\\\]'
       PS1="${SCREENTITLE}${PS1}"
   fi

Однако, очень хотелось заставить screen менять заголовок окна в зависимости от того, на какой сервер/железку я зашел с помощью ssh или telnet. Сделал это парой скриптов (оберток) для ssh и telnet, сохранил их в каталоге ~/.scripts и добавил этот каталог в начало окружения PATH.

.scripts/telnet

   #!/bin/bash

   echo -ne "\ek->`echo $@|awk 'BEGIN{opts="-l-n-e"}
   {for(i=1;i<=NF;i++){if(substr($(i),1,1)=="-")
   {if(index(opts,$(i))!=0)i++;continue;}break;}print $(i);}'`\e\\"
/usr/bin/telnet $@ < `tty` > `tty`

.scripts/ssh

   #!/bin/bash

   echo -ne "\ek->`echo $@ | awk 'BEGIN{opts="-b-c-D-e-F-I-i-L-l-m-O-o-p-R-S-W-w"}
   {for(i=1;i<=NF;i++){if(substr($(i),1,1)=="-")
   {if(index(opts,$(i))!=0)i++;continue;}break;}print $(i);}'`\e\\"
/usr/bin/ssh $@ < `tty` > `tty`

URL: http://trushkinv.livejournal.com/65667.html
Обсуждается: https://www.opennet.ru/tips/info/2397.shtml

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Динамическое изменение заголовков окон в screen"  +/
Сообщение от default (??) on 28-Июн-10, 09:53 
"оттабили" неудачно. последние команды, вызывающие telnet и ssh являются частью скриптов.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Динамическое изменение заголовков окон в screen"  +/
Сообщение от Админ Веня on 28-Июн-10, 10:47 
tmux вроде умеет изкаропки
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Динамическое изменение заголовков окон в screen"  +/
Сообщение от Аноним email(??) on 28-Июн-10, 12:26 
Вместо /usr/bin/ssh можно написать просто `command ssh'. А вместо отдельных скриптов, кои запускают новый процесс лучше избавиться от awk'а и tty (юзать getopts/case/$TTY), сделать чистые функции и сорсить их из ~/.bashrc.

Просто судя по тому, что у автора в скрипте, ему хватит и POSIX shell'а. Стоит лишь заменить [[ blah ]] на [ blah ]. Можно было вообще обойтись одним awk'ом или одним sh.

Например, на zsh это бы выглядело так

    typeset -A wrap_cmds

    # telnet/main.c
    wrap_cmds+=(telnet 468EKLNS:X:acde:fFk:l:n:rs:uxy)
    # openssh/ssh.c
    wrap_cmds+=(ssh 1246ab:c:e:fgi:kl:m:no:p:qstvxACD:F:I:KL:MNO:PR:S:TVw:W:XYy)

    set-title() echo "\ek$*\e\\"

    () { local fun; for fun (${(k)wrap_cmds}) $fun() {
        local opt OPTIND OPTARG

        # erase options and their arguments from argv[]
        while getopts $wrap_cmds[$0] opt; do done
        shift $((OPTIND - 1))

        set-title "$0 $*"
        command $0 "$@"
    }}

Потом из ~/.zshrc можно делать `source ~/.title_wrappers', который нагенериует wrapper-функций на основе массива wrap_cmds. А wrap_cmds можно заполнить разными командами, если погрепать исходники каждой на вызов функции getopt(3) или getopt_long(3).

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "Динамическое изменение заголовков окон в screen"  +/
Сообщение от default (??) on 28-Июн-10, 12:35 
Действительно, учитывая размер скриптов, лучше это дело реализовать в виде wrapper-функций шелла. Спасиб.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "Динамическое изменение заголовков окон в screen"  +/
Сообщение от Аноним email(??) on 28-Июн-10, 12:48 
В моем примерчике, кстати, стираются опции с аргументами к ним не только в заголовке, но и при запуске самой команды. Поправить это просто, но я оставлю это как домашнее задание. ;)
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "Динамическое изменение заголовков окон в screen"  +/
Сообщение от Аноним (??) on 30-Июн-10, 03:05 
>>if [[ "$TERM" == "screen" ]]; then

if [ "$TERM" = "screen" ]; then

короче и посиксно. Зачем так увлекаться башем? ;)

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "Динамическое изменение заголовков окон в screen"  +/
Сообщение от Andrey Mitrofanov on 30-Июн-10, 09:14 
>короче и посиксно. Зачем так увлекаться башем? ;)

Угу, в .bashrc посиксность и переносимость -- Первое Дело! B*)

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

8. "Динамическое изменение заголовков окон в screen"  +/
Сообщение от splat_pack (ok) on 02-Июл-10, 15:32 
не кросплатформенно ни разу
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

9. "Динамическое изменение заголовков окон в screen"  +/
Сообщение от Аноним email(??) on 05-Июл-10, 12:55 
bash, gawk и tty кросплатформенны. А вот /usr/bin/ssh - нет, нет никакой гарантии что ssh будет находится в /usr/bin; тоже самое с /bin/bash. Первое решается с помощью встроенной команды command, второе с помощью популярного хака - #! /usr/bin/env bash
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2020 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру