116

I need it to determine if hitting ctrl+d would disconnect me from server or just close current screen.

Is it somehow possible to check if I'm right now in screen session?

wlk
  • 1,733

9 Answers9

166

You can look at the $STY variable (a variable set by the screen command). If it is not "" then you are in a screen session.

I am in screen

$ echo $STY 
29624.pts-1.iain-10-04
$

I am not in screen

$ echo $STY

$
rogerdpack
  • 585
  • 2
  • 8
  • 23
user9517
  • 116,228
  • 13
    This presumes that you are still within a running session on the local computer. If you start up screen and then SSH somewhere else, this won't work. – David Mackintosh Apr 11 '11 at 03:05
  • 2
    if test -n "$STY"; then printf "This is a screen session named '$STY'.\n"; else printf "This is NOT a screen session.\n"; fi – aggregate1166877 Sep 19 '15 at 17:08
  • 3
    @DavidMackintosh if you're SSH'd into somewhere else, hitting ctrl-D will "disconnect me from server", which is exactly what the question asks about. – womble Aug 11 '16 at 08:24
  • 1
    @aggregate1166877 I have this if you posted as an alias in every single machine that I use now. – Eduardo Bezerra Sep 10 '16 at 12:32
  • This doesn't work in a sudo script run inside a screen – ceztko Nov 07 '21 at 14:14
55

You can look at the $TERM variable.

echo $TERM

If it's a screen session, the term variable should return "screen".

root@deore:/volumes# echo $TERM
screen

Ctrl-a -d (to exit screen)

root@deore:/volumes# echo $TERM
xterm

Also check: https://stackoverflow.com/questions/3472287/how-do-you-tell-if-the-current-terminal-session-is-in-gnu-screen

ewwhite
  • 198,150
39

Unless you have changed the default key bindings, you can do Ctrl+a -> Ctrl+t, which will show the time, if you are in screen. This will work even if you have ssh:d away somewhere else, unlike the other suggestions.

slava
  • 161
Gurgeh
  • 483
  • 4
  • 3
24

The caption command in the ~/.screenrc is a nice way to differentiate a screen session.

I'm personally using this:

$ cat ~/.screenrc
caption always "%{= kc}Screen session on %H (system load: %l)%-28=%{= .m}%D %d.%m.%Y %0c"

It adds a line like this one at the bottom of the screen:

Screen session on gbook (system load: 1,75 1,74 1,68)                   Lun 05.01.2015 13:01

With the first part (system name + load) in green and the date in pink. Useful and hard to miss!

  • 2
    This is perfect! It does not get in the way (bottom position), it is always visible (and colored) and provides useful info about system. I posted this here also http://stackoverflow.com/a/43571028/2450431 – hrvoj3e Apr 23 '17 at 12:22
  • I'd like to add $STY in it. caption always "%{= kc}Screen $STY on %H (system load: %l)%-28=%{= .m}%D %d.%m.%Y %0c" – John Lee Dec 22 '22 at 01:25
7

I have found another solution:
Modify your .screenrc, so my screen session looks completely different from normal terminal.

wlk
  • 1,733
  • I think I know what you're suggesting, and it could in some situations avoid this problem entirely. It might be more helpful if you describe what you mean by showing (e.g.) an example .screenrc file. – jvriesem Apr 29 '19 at 18:42
4

Better answer (in my opinion), inspired by this, just type the following:

pstree -s $$

If you get something like this:

systemd───sshd───sshd───bash───screen───screen───bash───pstree

… then you are in screen.

This is true not only for screen, but also for any kind of process (like script, nested bash or other shells) opening a nested shell, and this can even also show nested screen calls (if several not consecutive occurrences exists).

  • This would be a good answer but it should be worked on further to allow scripting – ceztko Nov 07 '21 at 14:22
  • 1
    Scripting was not asked inside initial question, but if really required: if [[ $(pstree -s $$) =~ screen ]] ; then echo 'yes' ; else echo 'no' ; fi – GingkoFr Nov 08 '21 at 15:40
  • I would suggest [[ $(pstree -sA $$) =~ ---screen--- ]], this will reduce the risk of a false positive. – Glushiator Jun 10 '22 at 15:25
0

If you are looking at a command line prompt, you can just type something, anything, and hit Ctrl+A. If your cursor jumps to the beginning of the prompt, you're not inside a screen. If you additionally have to hit A, then you are.

-1

Do a screen -ls. It's going to explicitly indicate Attached versus Detached status.

Example attached:

$ screen -ls | grep tached
3132.pts-0.esavo00      (Attached)

Example detached:

$ screen -ls |grep tached
3132.pts-0.esavo00  (Detached)
-1
screen -ls

to view your sessions and

screen -r sessioninfo

to reconnect to a disconnected one, if detached.

screen -D -r sessioninfo

to reconnect to a disconnected one.

Kevin
  • 1