GNU Screen 和 .bashrc

GNU Screen 和 .bashrc

我正在尝试使用我的 启动 GNU Screen .bashrc。我快完成了:

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

但这是错误的!第一种情况有效,screen当我打开终端时启动。但第二部分失败了。如果我已经打开了一个常规终端,我想打开一个。但这只会打开无数个终端……

答案1

您可以尝试(在 else 之后):

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

答案2

如果我没记错的话,只要删除“else”块,终端就会正常打开……或者也许我遗漏了什么东西。

答案3

我设置的方式是,如果连接到的每台服务器有 Screen,我都会启动 Screen。当我断开连接并重新连接时,会重新连接相同的 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_注销

# ~/.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 上均可运行(这就是您在 stat、touch 和 date 命令中看到“2>/dev/null ||”的原因)。我还使用 256 色 xterm,我相信所有支持代码都包含在此处。尽管这篇文章很长,但我已从脚本/配置中删减了很多内容。

答案4

只需输入:

if [ -z "$STY" ]; then
   screen -ARR
fi

请注意,这里没有exec,并且else不需要。然后您只需键入即可exit返回常规终端。

使用-ARR还有一个好处,那就是它将始终恢复第一的如果有的话,它会创建一个适当的分离屏幕会话。否则,它将创建一个新的,这正是您想要实现的。

来源:Screen 手册页

相关内容