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).