端末セッションが画面内で実行されているかどうかを確認する方法


9

bashスクリプトを実行するときに、それが内で実行されているかどうかを確認できるようにしたいと思いますscreen。これは可能ですか?

これ.bashrcは、セッションが画面内で開始されるかどうかに応じてコマンドプロンプトの色を設定できるようにするためです。

自分の答えが出たら、このリンクを見つけました。自分が画面にいるかどうかはどうすればわかりますか?

回答:


10

通常は$STY設定されます。

そう:

if [ -n "$STY" ]; then
  echo "I'm most likely running under screen"
fi

$STY通常は、と通信する必要がありますscreen。これは、制御に使用されるUnixドメインソケットのパスを構築するために使用されますscreen(のようなもの/var/run/screen/S-$USER/$STY

たとえば、その画面sshから別のマシンに移動した場合は機能しません。そこで起動されたシェル$STYはその環境にはありません。それは、マシンのUnixドメインソケットにアクセスできないため、とにかく役に立ちません。

ただし、エスケープシーケンスを使用して端末を照会し、そのタイプを判別することができます。

if [ -t 1 ] && [ -t 0 ]; then
  s=$(stty -g)
  stty -icanon -echo min 0 time 3
  printf '\033[>c'
  type=$(dd count=1 2> /dev/null)
  stty "$s"
  case $type in
    (*'>83;'*) echo "this is screen"
  esac
fi

@ val0x00ffで提案されている別のアプローチは、$TERM環境変数の値を確認することです。その値は、アプリケーションが通信している端末のタイプをアプリケーションに通知するためのものです。(端末のさまざまなバリアントを実装できるscreenように)で始まるものに設定されます。accross渡され、、、。上記のように動作することは保証されていませんが、シンプルで邪魔になりません。screenscreen$TERMrloginrshtelnetssh

case $TERM in
  (screen*) echo "I'm more than likely running in screen"
esac

前のソリューションと同様に、で実行しscreenている可能性がありますがscreen -X、たとえばでコマンドを発行できない場合があります。ただし、エスケープシーケンスを使用してコマンドを渡すことができることに注意してください(ただし、セキュリティ上の理由から、デフォルトでは有効になっていません)。


4

screenで実行すると、$TERM環境変数がscreenに変わります。あなたはスクリプトでチェックすることができます例えば

if [[ "$TERM" == screen* ]]; then
  echo "Running in screen"
else 
  echo "Outside screen"
fi 

それはアプローチの1つでしょう。echo $TERM画面の外側と画面のecho $TERM内側で違いを確認します


$ TERMは "xterm"に設定されています。したがって、これは私の場合は機能しません。
aakoch

1

私は自分でtmuxを使用しています。これは、tmuxセッションにまだ参加していない場合にのみ、セッションを一覧表示するために使用します。

if [ -z "$TMUX" ]; then
    alias tmuxa='tmux attach -d -t'
    alias tmuxc='tmux new-session -s'
    echo "You're not in a tmux session, create a new one with tmuxc, or attach to one of the ones below with tmuxa"
    tmux ls
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.