Как бороться с приглашением в консоли? (Исчезает tty из приглашения в mc)

Sabayon, Calculate, Funtoo, Exherbo

Модератор: /dev/random

Vasyx
Сообщения: 50
ОС: Gentoo

Как бороться с приглашением в консоли?

Сообщение Vasyx »

Вот отрывок из /etc/bash/bashrc

Код: Выделить всё

if ${use_color}; then
    if [[ ${EUID} == 0 ]]; then
        PS1='\[\033[1;35;40m\]$(date +%H:%M) \[\033[1;31;40m\]\u\[\033[1;32;40m\]@\l \[\033[1;37;40m\]\w:\[\033[1;31;40m\]\$\[\033[00m\] '
    else
        PS1='\[\033[1;35;40m\]$(date +%H:%M) \[\033[1;33;40m\]\u\[\033[1;32;40m\]@\l \[\033[1;37;40m\]\w:\[\033[1;31;40m\]\$\[\033[00m\] '
    fi

    alias ls='ls --color=auto'
else
    if [[ ${EUID} == 0 ]]; then
        # show root@ when we don't have colors
        PS1='\[$(date +%H:%M) \u@\l \W:\$\] '
    else
        PS1='\[$(date +%H:%M) \u@\l \w:\$\] '
    fi
fi


Почти все стандартное, приглашение отображается следующим образом

Код: Выделить всё

12:00 user@tty1 ~:$

Но когда запускаешь mc или терминалку, то оно меняется на следующее

Код: Выделить всё

12:01 user@1 ~:$


Хотелось бы либо убрать 'tty' из приглашения в консоли, либо добавить его в приглашение в mc и терминале. Перекопал весь /etc, но ничего не нашел. Гугл по ключевым словам 'gentoo tty' ничего вразумительного на этот счет не дал. Подскажите кто знает
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Как бороться с приглашением в консоли?

Сообщение xorader »

echo $PS1 в обоих случаях посмотрите
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали:
Vasyx
Сообщения: 50
ОС: Gentoo

Re: Как бороться с приглашением в консоли?

Сообщение Vasyx »

В том то и дело, что выводится одно и то же

Код: Выделить всё

\[\033[1;35;40m\]$(date +%H:%M) \[\033[1;33;40m\]\u\[\033[1;32;40m\]@\l \[\033[1;37;40m\]\w:\[\033[1;31;40m\]\$\[\033[00m\]


Я подозреваю, что какие-то гентушные скрипты (в других дистрах такого не замечено) до экспорта PS1 что-то делают с \l, а потом каким-то образом изменения перестают действовать, т.к. 'tty' можно увидеть только в приглашении голой консоли или в приветствии, когда используешь \l в /etc/issue, например так

Код: Выделить всё

Welcome to \n@\l

И получаем

Код: Выделить всё

Welcome to host@tty1
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Как бороться с приглашением в консоли?

Сообщение xorader »

локаль utf-8 ?
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали:
Vasyx
Сообщения: 50
ОС: Gentoo

Re: Как бороться с приглашением в консоли?

Сообщение Vasyx »

Код: Выделить всё

10:37 vasyx@1 ~:$ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: Как бороться с приглашением в консоли?

Сообщение router »

Господа, а вас не смущает тот факт, что в иксах Вы имеете дело не с терминалом ( которому, в том числе, соответствует и файл устройства /dev/tty[0-9]*), а с псевдотерминалом, для которого нумерация иная? ;)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Как бороться с приглашением в консоли?

Сообщение serzh-z »

router писал(а):
24.02.2006 13:58
Господа, а вас не смущает тот факт, что в иксах Вы имеете дело не с терминалом ( которому, в том числе, соответствует и файл устройства /dev/tty[0-9]*), а с псевдотерминалом, для которого нумерация иная? ;)


А если добавить в PS, что-то подобное этому, то, вероятно, pts будет показан:

Код: Выделить всё

\($(tty | sed s/\/dev\///)\)
Спасибо сказали:
Vasyx
Сообщения: 50
ОС: Gentoo

Re: Как бороться с приглашением в консоли?

Сообщение Vasyx »

А mc, запущенный в голой консоли, тоже использует виртуальный терминал?
Все же я не думаю, что это так важно для отображения (или неотображения) 'tty' - ну не может же виртуальный терминал называться просто '1' или '2'. Тем более если mc запустить в третьей консоли, то приглашение меняется с 'user@tty3' на 'user@3', т.е. цифра в приглашении mc соответствует номеру консоли в которой он запущен, просто пропадает 'tty'. Только что проверил в слаке: с тем же значением PS 'tty' отображается и в терминале и в консоли и в mc. Хотя, наверное, просто я чего-то не понимаю.

Добавил в PS

Код: Выделить всё

\($(tty | sed s/\/dev\///)\)

Получил

Код: Выделить всё

sed: -e выражение #1, символ 8: неизвестный модификатор к `s'
17:43 vasyx@\(\) ~:$
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: Как бороться с приглашением в консоли?

Сообщение router »

Vasyx писал(а):
24.02.2006 17:51
А mc, запущенный в голой консоли, тоже использует виртуальный терминал?
Все же я не думаю, что это так важно для отображения (или неотображения) 'tty' - ну не может же виртуальный терминал называться просто '1' или '2'. Тем более если mc запустить в третьей консоли, то приглашение меняется с 'user@tty3' на 'user@3', т.е. цифра в приглашении mc соответствует номеру консоли в которой он запущен, просто пропадает 'tty'. Только что проверил в слаке: с тем же значением PS 'tty' отображается и в терминале и в консоли и в mc. Хотя, наверное, просто я чего-то не понимаю.

Признаю, был неправ :unsure:
Когда отвечал, не обратил внимания на mc. Поэтому псевдотерминалы возможно, непричём

НО! mc действительно использует какую-то другую нумерацию :ph34r: . Запустив несколько мс в консоли и установив приглашение

Код: Выделить всё

 PS1='\[$(date +%H:%M) \u@\l \W:\$\] '
, получил 19:42 router@4 ~:$ в первой консоли
Спасибо сказали:
Vasyx
Сообщения: 50
ОС: Gentoo

Re: Как бороться с приглашением в консоли?

Сообщение Vasyx »

(router @ Feb 24 2006, в 19:52) писал(а):получил 19:42 router@4 ~:$ в первой консоли


да, действительно, ошибочка вышла... номер в mc не всегда соответствует номеру консоли.. Но в общем-то, это нисколько не приближает решение проблемы... Хотя если кто-то подскажет какая именно зависимость между пропродающим 'tty', номером консоли и номером в mc буду премного благодарен!
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Как бороться с приглашением в консоли?

Сообщение serzh-z »

router писал(а):
24.02.2006 19:52
Признаю, был неправ :unsure:


Да нет, кстати, вы оказались правы - mc для запуска подчинённого терминала использует pts.

Почему появляются цифры вместо имён? bash разворачивает "\l" в basename `tty`. Соответственно получается, что вместо /dev/pts/10 мы имеем просто 10 в качестве имени терминала.

Убедиться в этом можно, например, так (в консоли mc или в каком-нибудь терминале): export PS1="\w `tty` $" - получим что-то типа "~ /dev/pts/10 $".

Мои соображения как получить то приглашение, что и для виртуального (не псевдо, в смысле) терминала:
* Найти способ запрашивать имя терминала TTY, а не псевдо. Т.е. вместо "\l" должно что-то, что развернётся в имя TTY, а не в PTS - я лично, при поверхностном поиске в манах, ничего не нашёл.
* Или же, запускать mc через псевдоним, например "alias mc=my-mc.sh". my-mc.sh примерно таков:

Код: Выделить всё

IS_MC=1 REAL_VIRT_TTY="\l" PS="\u on ${REAL_VIRT_TTY} $" mc


А в bashrc сделать так:

Код: Выделить всё

if ${IS_MC}; then
PS1="\u on ${REAL_VIRT_TTY} $"
else
PS1="\u on \l $"
fi


Т.е. идея такова, что перед запуском mc нужно передать ему имя TTY, когда он будет запускать bash, тот проанализирует откуда он был запущен и в зависимости от этого - либо запросит переданного извне имя терминала или же просто использует имя терминала, которое возвращает tty.

В общем - всё в наших руках. :bounce:
Спасибо сказали:
Vasyx
Сообщения: 50
ОС: Gentoo

Re: Как бороться с приглашением в консоли?

Сообщение Vasyx »

Гммм... А как быть с терминалкой в иксах??? Тоже создать альяс? :huh:

Огромное спасибо за участие в решении проблемы!!! Буду капать еще, по крайней мере теперь знаю куда! :) Надеюсь это не единственный способ...
Спасибо сказали:
Vasyx
Сообщения: 50
ОС: Gentoo

Re: Как бороться с приглашением в консоли?

Сообщение Vasyx »

Идея уважаемого serzh-z хороша, но предложенный им код всего лишь иллюстрация к решению, т.к. он непригоден для реального использования. Я довел решение до полной реализации и оно идейно ничем не отличается от проиллюстрированного выше, просто оно действительно рабоатет. Любые исправления и советы по оптимизации приветствуются

Код: Выделить всё

# /etc/bash/bashrc
#
# This file is sourced by all *interactive* bash shells on startup,
# including some apparently interactive shells such as scp and rcp
# that can't tolerate any output.  So make sure this doesn't display
# anything or bad things will happen !
#
#
# Test for an interactive shell.  There is no need to set anything
# past this point for scp and rcp, and it's important to refrain from
# outputting anything in those cases.
if [[ $- != *i* ]]; then
    # Shell is non-interactive.  Be done now!
    return
fi

# Bash won't get SIGWINCH if another process is in the foreground.
# Enable checkwinsize so that bash will check the terminal size when
# it regains control.  #65623
# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11)
shopt -s checkwinsize

safe_term=${TERM//[^[:alnum:]]/.}

if [[ -f /etc/DIR_COLORS ]]; then
    grep -q "^TERM ${safe_term}" /etc/DIR_COLORS
fi

# MC_RUN is a flag variable that let you know if mc runs on this tty
if [[ ${MC_RUN} != 1 ]]; then
    if [[ ${EUID} == 0 ]]; then
    PS1='\[\e[1;35;40m\]$(date +%H:%M) \[\e[1;31;40m\]\u\[\e[1;32;40m\]@\l \[\e[1;37;40m\]\w:\[\e[1;31;40m\]\$\[\e[0m\] '
    else
    PS1='\[\e[1;35;40m\]$(date +%H:%M) \[\e[1;33;40m\]\u\[\e[1;32;40m\]@\l \[\e[1;37;40m\]\w:\[\e[1;31;40m\]\$\[\e[0m\] '
    fi
else
# If you run mc in terminal, then there is no real tty, except that where you launched X.
# that's why tty here isn't needed
    case $TERM in
    xterm*|rxvt*|Eterm)
        PS1='\u \w \$ '
    ;;
    screen*|linux)
        PS1='\u@$TTY \w \$ '
    ;;
esac
fi

# Try to keep environment pollution down, EPA loves us.
unset safe_term

alias ls='ls --color=auto'

# This alias is needed to set some variables to proper value
alias mc='. /usr/share/mc/bin/mc-wrapper.sh'


Код: Выделить всё

# /usr/share/mc/bin/mc-wrapper.sh
#
# Say that mc is up and running
export MC_RUN=1

# Set proper tty.
export TTY=$(tty)
export TTY=${TTY##*/}
MC_USER=`id | sed 's/[^(]*(//;s/).*//'`
MC_PWD_FILE="${TMPDIR-/tmp}/mc-$MC_USER/mc.pwd.$$"
/usr/bin/mc -c -P "$MC_PWD_FILE" "$@"

if test -r "$MC_PWD_FILE"; then
    MC_PWD="`cat $MC_PWD_FILE`"
    if test -n "$MC_PWD" && test -d "$MC_PWD"; then
        cd "$MC_PWD"
    fi
    unset MC_PWD
fi

rm -f "$MC_PWD_FILE"

# Try to keep environment pollution down, EPA loves us.
export MC_RUN=0
unset MC_PWD_FILE
unset MC_RUN
unset TTY
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Как бороться с приглашением в консоли?

Сообщение xorader »

о хоспоти... это ж думать нуна :)

запости плз на bugs.gentoo.org -- думаю, включат в mc ebuild :rolleyes:
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали:
Аватара пользователя
nesferato
Сообщения: 472
Статус: В изобилии!
ОС: Fedora, Slackware

Re: Как бороться с приглашением в консоли?

Сообщение nesferato »

2Vasyx:
Спасибо за скрипты, то что надо и чего пока не мог сделать сам :)
А где можно собственно почитать теорию, чтобы разобраться, хотя бы чтобы понимать это:
"\[\e[1;31;40m\]\u\[\e[1;32;40m\]@\l \[\e[1;37;40m\]\w:\[\e[1;31;40m\]\$\[\e[0m\]"?
А то пока связно проинтерпритировать у себя в мозгу не получается :), хочется чтобы все было одного цвета, а не радугой, но пока не знаю как :( Заранее спасибо.
Результат пропорционален осознанности.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Как бороться с приглашением в консоли?

Сообщение serzh-z »

xorader писал(а):
28.02.2006 14:02
запости плз на bugs.gentoo.org -- думаю, включат в mc ebuild :rolleyes:


Упс... А зачем??? Разве лучше видеть в каждом экзепляре (если они запущены в одной виртуальной консоли) mc имя консоли самого верхнего процесса? Если, честно, интересно - если у меня работает в /dev/pts/10 bash, который был запущен mc (а он, в свою очередь, был запущен из tty5), и я делаю, скажем, echo "Hello TTY5 ;]" > /dev/tty5, то получит ли bash на pts/10 это сообщение... Что-то мне подсказывает, что нет - его получил родительский mc...

Встаёт вопрос - а нужно ли мне знать TTY родительского процесса - мне нужно знать тот терминал в котором я именно сейчас набиаюю команды, т.е. /dev/pts/10.

Кстати, а для mc под X - там разве для всех терминалов не показывается tty7 или подобное - ведь иксы-то владеют лишь одним TTY (и кучей PTS)??? :o :huh:
Спасибо сказали:
Vasyx
Сообщения: 50
ОС: Gentoo

Re: Как бороться с приглашением в консоли?

Сообщение Vasyx »

(serzh-z @ Feb 28 2006, в 16:07) писал(а):Если, честно, интересно - если у меня работает в /dev/pts/10 bash, который был запущен mc (а он, в свою очередь, был запущен из tty5), и я делаю, скажем, echo "Hello TTY5 ;]" > /dev/tty5, то получит ли bash на pts/10 это сообщение... Что-то мне подсказывает, что нет - его получил родительский mc...

Только что проверил, и оказалось, что да!!! Получит. Мало того, я запустил mc в tty4 и с tty3 выполнил следующее

Код: Выделить всё

echo "hello" > /dev/tty4

и в командной строке mc, запущенного на tty4 получил "hello".
Из запущенного mc в tty4 выполнил то же самое и тоже получил "hello" в командной строке mc.
То есть можно отправлять сообщения в любой телетайп и если там запущен mc, а из этого mc еще что-нибудь, то это 'что-нибудь' эти сообщения получит!!!


(serzh-z @ Feb 28 2006, в 16:07) писал(а):Кстати, а для mc под X - там разве для всех терминалов не показывается tty7 или подобное - ведь иксы-то владеют лишь одним TTY (и кучей PTS)???

Смотри код выше, tty в терминалке и даже в запущенном в этой терминалке mc не отображается, так как он действително там не нужен.
(Vasyx @ Feb 27 2006, в 19:31) писал(а):# If you run mc in terminal, then there is no real tty, except that where you launched X.
# that's why tty here isn't needed
case $TERM in
xterm*|rxvt*|Eterm)
PS1='\u \w \$ '
;;
screen*|linux)
PS1='\u@$TTY \w \$ '
;;
esac
fi



(nesferato @ Feb 28 2006, в 15:41) писал(а):А где можно собственно почитать теорию, чтобы разобраться, хотя бы чтобы понимать это:

Про значение \[, \], \u, \l, \w, \$ и другие читать man bash
Про цвета http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html можно тут почитать.
Кстати, это самая первая ссылка, которую дает www.google.com/linux на запрос 'bash colors'.
Привожу таблицу соответствия значений и цветов
Изображение
Спасибо сказали:
Аватара пользователя
nesferato
Сообщения: 472
Статус: В изобилии!
ОС: Fedora, Slackware

Re: Как бороться с приглашением в консоли?

Сообщение nesferato »

2Vasyx:
Спасибо, буду читать :)
Результат пропорционален осознанности.
Спасибо сказали: