web-dev-qa-db-ja.com

画面内にいるかどうかを確認するにはどうすればよいですか?

Linuxで画面を使用している場合、画面にいるかどうかはどうすればわかりますか? exitを実行すると、画面が表示されていた場合は終了しますが、表示されなかった場合は、ターミナルを閉じてしまいます。

screen -r、他の画面が接続されているかどうかは確認できましたが、現在の端末がこれらの接続された画面の1つであるかどうかを確認するにはどうすればよいですか?

70
user8125

小切手 $STY。 nullの場合、「実際の」端末を使用しています。何かが含まれている場合は、現在の画面の名前です。

画面にいない場合:

eric@dev ~ $ echo $STY
eric@dev ~ $ 

画面にいる場合:

eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71
115
jho

もう1つの方法は、$ TERMをエコーすることです。

 $ echo $TERM
 screen

私はこれを何度も行うことになるので、.bashrcファイルにエイリアスを追加しました。

alias trm='echo $TERM'

この方法では、画面内かどうかに関係なく、 'trm'を実行しただけで、SCREENまたは他の場所(通常はXTERM)にいるかどうかが表示されます。

15
JJC

画面にいるかどうかを確認する別の方法。

タイプ:

Ctrl-a ?

画面のヘルプが表示された場合は、画面にいます。

そうしないと、疑問符「?」が表示されます。プロンプトで。

11
pors

echo $STY;これにより、接続された画面がプロセスIDとともに返されます。

$ echo $STY 
  34046.myScreen
7
raim

ここにある他のすべてのメソッドは、環境変数(単純にオーバーライドできる)またはscreenのコマンド文字(オーバーライドもできる)に依存しているため、確認する最も簡単な方法は、現在のプロセスのすべての祖先をリストすることです。

pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | grep screen | wc -l

それが1を出力する場合、実行中の現在のプロセスには、実行可能ファイルの名前にWordの「画面」がある祖先があり、それ以外の場合はありませんでした。

より簡単な目視検査は、以下から取得できます。

pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | less
2
Parthian Shot

次の1つ以上を.bashrcに追加してください

  • alias mysession='echo ${STY}'
  • alias myterm='echo ${TERM}'
  • alias isscreen='if test -n "$STY"; then echo " screen session: ${STY}"; else echo " NOT a screen session"; fi'

次に、単純なコマンドを入力して、screenの内部にいるかどうかを確認できます。

1
Lee

リモート(古い)システムにsshを実行したところ、$ TERMが「screen-256color」を使用していることを示していることに気付きましたが、そのためのtermcap/terminfoエントリがなかったため、.bashrcで次の方法で端末が時々ゴミを生成しないようにします。

_case $TERM in 
    (screen-256color) export TERM='screen'
esac
_

代わりにプレーンエントリを使用するようにします。

TL; DR、$ TERMは通常は、リモートでsshを実行したときにスクリーンセッションにいるかどうかを示します。視覚的な手掛かりだけが必要で、特定のことを行う必要がない場合は、case $TERM in (screen*) echo "you are in a screen session"; esacを使用できます。

1
WebDragon

問題に対する私の解決策は、はるかに単純です:ちょうどhitting TAB 内部GNUスクリーンの場合、完全なターミナルブリンク(クイックビデオ反転)を作成します。

ほとんどのLinux(Ubuntu、Kali、Debian、RaspBerry ...など)およびFreeBSD、GUI、およびローカルまたはリモートを含むすべての端末でテスト済み CtrlAltFn もの。

このメソッドのexceptionとして、この(かなり複雑ですが可能)ケースシナリオに注意してください。

  • 1.-コンピューターAにSSH接続します(Linuxを想定)。
  • 2.-コンピュータAのリモート端末から新しいscreen -S AScrを入力します。
  • 3.- GNU Screen AScr端末からコンピューターBにSSHで接続します。
  • 4.-コンピューターBのリモート端末から新しいscreen -S BScrを入力します。

ケース2と4ではScreenの内側、ケース1と3ではScreenの外側ですが、ケース2、3、4では端末が点滅します。

上記の回答のほとんどの問題は、接続された画面セッションのサブシェルにいる可能性があることです。または、スクリーンセッション内からリモートホストへのシェルを開く場合もあります。前者の場合、プロセスツリーの親子関係を調べて、screenプログラム名を照合できます。後者の場合、ほとんどの場合、TERM変数でscreen*のようなものを確認できます。

私の答えは/ u/Parthian-Shotに似ていますが、pstreeユーティリティにそれほど依存していません。彼が使用するオプションは私には利用できません。一方、私の実装はまだLinuxに依存しています。Linux以外のシステムの場合は、psコマンドを調整する必要があります。配列をサポートしていない古いシェルのシステムでは、さらに多くの回避策があります。とにかく:

ps_walk_parents() {
  local tmp
  local ppid=$PPID
  while [[ $ppid != 1 ]]; do
    tmp=($( ps -o ppid,comm -p $ppid ))
    ppid=${tmp[0]}  # grab parent pid
    echo ${tmp[1]}  # output corresponding command name
  done
}
if [[ "$TERM" =~ screen* ]] || ps_walk_parents |grep -qxi screen ; then
  # we are in a screen terminal 
fi

関数を少し最適化して、プロセスの親がターゲットのコマンド名( "screen")と一致するかどうかを検索するのをやめることもできますが、通常、関数は2〜3回の繰り返ししかヒットしません。おそらく、このコードを.bashrcや.profileなどの起動時の初期化に含めたいので、最適化する価値はありません。

0
Otheus