Come sapere se la sessione terminale è in esecuzione sullo schermo


9

Quando eseguo uno script bash, vorrei essere in grado di dire se è in esecuzione all'interno di a screen. È possibile?

Lo voglio in modo che .bashrcpossa impostare il colore del prompt dei comandi a seconda che le sessioni vengano avviate all'interno di uno schermo o meno.

Ho scoperto questo link dopo aver risposto al mio: come posso sapere se sono su uno schermo?

Risposte:


10

In genere, $STYverrà impostato.

Così:

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

$STYè in genere ciò di cui hai bisogno per parlare con il tuo screen. Viene utilizzato per costruire il percorso del socket del dominio Unix utilizzato per controllare screen(qualcosa del genere /var/run/screen/S-$USER/$STY.

Ora, ad esempio, non funzionerà se da quella schermata si sshpassa a un'altra macchina. La shell iniziata lì non avrà $STYnel suo ambiente, e non ci sarebbe comunque utile, dal momento che non sarebbe in grado di accedere ai socket del dominio Unix sul tuo computer.

Tuttavia, è possibile interrogare il terminale con una sequenza di escape per determinarne il tipo:

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

Un altro approccio, come suggerito da @ val0x00ff, è quello di verificare il valore della $TERMvariabile d'ambiente. Questo valore ha lo scopo di dire alle applicazioni con quale tipo di terminale stanno parlando. È impostato screensu qualcosa che inizia con screen(come screenpuò implementare diverse varianti di terminali). $TERMè passato dall'altra parte rlogin, rsh, telnet, ssh. Non è garantito che funzioni come sopra, ma è più semplice e meno invadente.

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

Come per la soluzione precedente, potresti essere in esecuzione screen, ma potresti non essere in grado di emettere comandi con esso, screen -Xad esempio. Tuttavia, è possibile passare i comandi utilizzando sequenze di escape (sebbene non sia abilitato per impostazione predefinita per motivi di sicurezza).


4

Quando si esegue sullo schermo, la $TERMvariabile di ambiente cambia in schermo. Puoi controllare lo script ad es

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

Questo sarebbe uno degli approcci. echo $TERMfuori dallo schermo e di nuovo echo $TERMall'interno dello schermo e vedere la differenza


$ TERM è impostato su "xterm". Quindi, nel mio caso non funzionerebbe.
Akakoch

1

Uso tmux da solo, e questo piccolo elenco per elencare le sessioni solo se non sono già in una sessione di 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.