web-dev-qa-db-ja.com

GNU画面と.bashrc

.bashrcを使用してGNU Screenを起動しようとしています。もうすぐです:

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

しかし、これは間違っています!最初のケースは機能します。ターミナルを開くとscreenが起動します。しかし、2番目の部分は失敗します。すでにターミナルを開いている場合は、通常のターミナルを開きたいです。しかし、これは無限の数の端末を開くだけです...

2
devin

あなたは(他の後に)試すことができます:

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

私が間違っていなければ、「else」ブロックを削除するだけでターミナルは正常に開きます...または何かが足りないのかもしれません。

1
Ivan

設定方法は、接続するすべてのサーバーで画面が表示されている場合に画面を起動します。切断して再接続すると、同じ画面セッションが再接続されます。これまでのところ良さそうです、それは誰もが望んでいることです。しかし、画面で複数のウィンドウを開いている場合、それらを閉じずに切断するにはどうすればよいですか? 2つのオプションがあります:

  1. 「 `」を押すと、優先するsshクライアントが切断されます。私のscreenrcでは「autodetach」を使用していますが、これはリモートでのみ機能します。
  2. ローカル(またはリモート)画面の場合、画面から切り離すとbashrcが切断されるように設定されています。ただし、まれに、接続を解除して接続を維持したい場合があります。そのために、.bashrcの魔法を補完するために.bash_logoutにいくつかの魔法があります。

.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の両方で機能します(これが、stat、touch、およびdateコマンドに「2>/dev/null ||」が表示される理由です)。私も256色のxtermを使用しており、すべてのサポートコードがここに含まれていると思います。この投稿の長さにもかかわらず、私はスクリプト/構成から多くを削除しました。

1
Bruno Bronosky