Назад | Перейти на главную страницу

Экран GNU и .bashrc

Я пытаюсь запустить GNU Screen, используя свой .bashrc. Я почти на месте:

if [ -z "$STY" ]; then
   exec screen -dR
else
   exec gnome-terminal
fi

Но это неправильно! Первый случай работает, screen запускается, когда я открываю терминал. Но вторая часть не удалась. Я хочу открыть обычный терминал, если он у меня уже открыт. Но это просто открывает бесконечное количество терминалов ...

Вы можете попробовать (после else):

if [ "$HAS_STARTED_TERM"!="1"]; then
    HAS_STARTED_TERM=1
    export HAS_STARTED_TERM
    exec gnome-terminal
fi

У меня все настроено, я запускаю screen на каждом сервере, к которому я подключаюсь, если на нем есть screen. Когда я отключаюсь и снова подключаюсь, снова подключается тот же сеанс экрана. Пока что звучит хорошо, этого все хотят. Но, если на экране открыто несколько окон, как отключить их, не закрывая их? Есть 2 варианта:

  1. Мой предпочтительный клиент ssh отключится, если я нажму "` ". и в моем screenrc я использую "autodetach", но это работает только удаленно.
  2. Для локальных (или удаленных) экранов мой bashrc настроен на отключение, если я отключаюсь от экрана. Однако в редких случаях вам нужно отключиться и оставаться на связи. Для этого в моем .bash_logout есть некоторая магия, дополняющая мою магию .bashrc.

.screenrc

hardstatus alwayslastline
hardstatus string '%{= kG} %{G}%H %{g}[%= %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}] %{W}%c %{g}'
#dynamic title
shelltitle '# |sh'

#When your ssh connection dies, screen is autodetached
autodetach on 

#terminfo and termcap for nice 256 color terminal
# allow bold colors - necessary for some reason
attrcolor b ".I"
# tell screen how to set colors. AB = background, AF=foreground
termcapinfo xterm "Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm"
termcapinfo xterm-color "Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm"
# erase background with current bg color
defbce "on"

.bashrc

# set a fancy prompt (non-color, unless we know we "want" color)
if [[ $TERM =~ xterm-.*color || $TERM =~ screen.* ]]; then
   PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]# '
   #if [[ $TERM =~ screen.* ]]; then
   export SCREEN_CMD=$(which screen 2>/dev/null)
   if [[ ( $TERM =~ screen.* ) || ${SCREEN_CMD-X} != X && ${SCREEN_CMD-X} != "" ]]; then
      # This is the escape sequence ESC k \w ESC \
      #Use path as title
      #SCREENTITLE='\[\ek\w\e\\\]'
      #Use program name as title
      SCREENTITLE='\[\ek\e\\\]'
   else
      #Soliton@freenode#screen suggested screen -xRRS primary
      echo ^[k$(hostname|sed "s/\..*//")^[\\
      export SCREEN_CMD=$(which screen 2>/dev/null)
      if [[ ${SCREEN_CMD-X} != X && ${SCREEN_CMD-X} != "" ]]; then
         screen -xRRS primary && unset SCREEN_CMD && [[ $(stat -c %Y .screen_do_not_disconnect 2>/dev/null || stat -f %m .screen_do_not_disconnect 2>/dev/null) -gt 0 ]] || exit
      fi
   fi
else
   PS1='\u@\h:\w# '
   SCREENTITLE=''
   #Soliton@freenode#screen suggested screen -xRRS primary
   echo ^[k$(hostname|sed "s/\..*//")^[\\
   export SCREEN_CMD=$(which screen 2>/dev/null)
   if [[ ${SCREEN_CMD-X} != X ]]; then
      screen -xRRS primary && unset SCREEN_CMD && [[ $(stat -c %Y .screen_do_not_disconnect 2>/dev/null || stat -f %m .screen_do_not_disconnect 2>/dev/null) -gt 0 ]] || exit
   fi
fi
PS1="${SCREENTITLE}${PS1}"

.bash_logout

# ~/.bash_logout

time="$(TZ=UTC date -d @0 2>/dev/null||date -r 0 +%Y%m%d%H%M)"
touch -d "$time" ~/.screen_do_not_disconnect 2>/dev/null || touch -t "$time" ~/.screen_do_not_disconnect

Приведенные выше сценарии работают как в Linux, так и в Mac OS X (именно поэтому вы видите «2> / dev / null ||» в командах stat, touch и date). Я также использую 256-цветной xterm и считаю, что сюда включен весь поддерживающий код. Несмотря на длину этого поста, я многое вырезал из скриптов / конфигураций.

Если не ошибаюсь, терминал нормально открылся бы, если бы просто убрать блок "else" ... А может я что-то упускаю.