In genere, $STY
verrà 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 ssh
passa a un'altra macchina. La shell iniziata lì non avrà $STY
nel 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 $TERM
variabile d'ambiente. Questo valore ha lo scopo di dire alle applicazioni con quale tipo di terminale stanno parlando. È impostato screen
su qualcosa che inizia con screen
(come screen
può 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 -X
ad esempio. Tuttavia, è possibile passare i comandi utilizzando sequenze di escape (sebbene non sia abilitato per impostazione predefinita per motivi di sicurezza).