So erkennen Sie, ob die Terminalsitzung auf dem Bildschirm ausgeführt wird

9

Wenn ich ein Bash-Skript ausführe, möchte ich feststellen können, ob es in einem ausgeführt wird screen. Ist das möglich?

Ich möchte dies, damit .bashrcdie Farbe der Eingabeaufforderung abhängig davon festgelegt werden kann, ob die Sitzungen auf einem Bildschirm gestartet werden oder nicht.

Habe diesen Link entdeckt, als meiner beantwortet wurde: Wie kann ich feststellen, ob ich auf einem Bildschirm bin?

DustByte
quelle

Antworten:

10

In der Regel $STYwird eingestellt.

Damit:

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

$STYist in der Regel das, was Sie brauchen, um mit Ihrem zu sprechen screen. Dies wird verwendet, um den Pfad des Unix-Domain-Sockets zu erstellen, der zur Steuerung verwendet wird screen(so etwas wie) /var/run/screen/S-$USER/$STY.

Das funktioniert zum Beispiel nicht, wenn Sie von diesem Bildschirm sshzu einem anderen Computer wechseln. Die dort gestartete Shell hat keine $STYUmgebung, und das würde ihr sowieso nichts nützen, da sie nicht auf die Unix-Domain-Sockets auf Ihrem Computer zugreifen kann.

Es ist jedoch möglich, das Terminal mit einer Escape-Sequenz abzufragen, um seinen Typ zu bestimmen:

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

Ein anderer Ansatz, wie von @ val0x00ff vorgeschlagen, besteht darin, den Wert der $TERMUmgebungsvariablen zu überprüfen . Dieser Wert soll den Anwendungen mitteilen, mit welchem ​​Terminaltyp sie sprechen. Es wird screenauf etwas gesetzt, das mit beginnt screen(da screenverschiedene Varianten von Terminals implementiert werden können). $TERMgeben accross ist rlogin, rsh, telnet, ssh. Es funktioniert nicht so garantiert wie oben, ist aber einfacher und weniger aufdringlich.

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

Wie bei der vorherigen Lösung werden Sie möglicherweise ausgeführt screen, können jedoch möglicherweise keine Befehle für diese Lösung ausgeben screen -X. Beachten Sie jedoch, dass Sie Befehle mithilfe von Escape-Sequenzen übergeben können (obwohl dies aus Sicherheitsgründen nicht standardmäßig aktiviert ist).

Stéphane Chazelas
quelle
4

Wenn Sie auf dem Bildschirm ausgeführt $TERMwerden, ändert sich Ihre Umgebungsvariable in Bildschirm. Sie können das Skript einchecken, z

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

Das wäre einer der Ansätze. echo $TERMaußerhalb des Bildschirms und wieder echo $TERMinnerhalb des Bildschirms und sehen Sie den Unterschied

Valentin Bajrami
quelle
Mein $ TERM ist auf "xterm" gesetzt. In meinem Fall würde das also nicht funktionieren.
Aakoch
1

Ich benutze tmux selbst und dieses kleine bisschen, um Sitzungen nur aufzulisten, wenn ich nicht bereits in einer tmux-Sitzung bin

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
Rqomey
quelle