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

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

bashスクリプトを実行するときにこれが可能であることを確認したいと思いますscreen

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

回答を受けた後、次のリンクが見つかりました。私が画面にあるかどうかはどうすればわかりますか?

答え1

通常$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その環境には1つもなく、コンピュータの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で始まるものに設定されています。通り過ぎる、、、。上記のように動作することを保証することはできませんが、より簡単で邪魔になりません。screenscreen$TERMrloginrshtelnetssh

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

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

答え2

画面で実行すると、$TERM環境変数が画面に変わります。次のスクリプトを確認できます。

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

方法の一つです。echo $TERM画面の外側とecho $TERM画面の違いをもう一度見てください。

答え3

私は直接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

関連情報