$STY will be set.
if [ -n "$STY" ]; then
echo "I'm most likely running under screen"
$STY is typically what you need to talk to your
screen. That is used to construct the path of the Unix domain socket used to control
screen (something like
Now, that won't work for instance if from that screen, you
ssh to another machine. The shell started there won't have
$STY in its environment, and that wouldn't be of any use to it anyway, since it wouldn't be able to access the Unix domain sockets on your machine.
However, it is possible to query the terminal with an escape sequence to determine its type:
if [ -t 1 ] && [ -t 0 ]; then
stty -icanon -echo min 0 time 3
type=$(dd count=1 2> /dev/null)
case $type in
(*'>83;'*) echo "this is screen"
Another approach, as suggested by @val0x00ff is to check the value of the
$TERM environment variable. That value is meant to tell applications what type of terminal they're talking to. It is set by
screen to something that starts with
screen can implement different variants of terminals).
$TERM is passed accross
ssh. It's not as guaranteed to work as the above but is simpler and less intrusive.
case $TERM in
(screen*) echo "I'm more than likely running in screen"
Like for the previous solution, you may be running in
screen, but you may not be able to issue commands to it with
screen -X for instance. However note, that you can pass commands using escape sequences (though it's not enabled by default for security reasons).