## 4.19. Stop Accidental Bourne-Shell Logouts

It's pretty easy to type one too many CTRL-d characters and log out of a Bourne shell without meaning to. The C shell has an ignoreeof shell variable that won't let you log out with CTRL-d. So do the Korn shell and bash; use `set -o` `ignoreeof`.

Here's a different sort of solution for the Bourne shell. When you end the shell, it asks if you're sure. If you don't answer yes, a new shell is started to replace your old one.

First, make a file like the C shell's .logout that will be read when your Bourne shell exits (Section 4.18). Save your tty (Section 2.7) name in an environment variable (Section 35.3), too -- you'll need it later:

`trap` Section 35.17

>     TTY=`tty`; export TTY
>     trap '. $HOME/.sh_logout; exit' 0

(Your system may need `$LOGDIR` instead of `$HOME`.) Put the following lines in your new .sh_logout file:

`exec <` Section 36.15, `case` Section 35.11, `exec` Section 24.2, `-sh` Section 3.19

>     exec < $TTY
>     echo "Do you really want to log out? \c"
>     read ans
>     case "$ans" in
>     [Yy]*) ;;
>     *)  exec $HOME/bin/-sh ;;
>     esac

The last line uses some trickery to start a new login shell (Section 3.19). The shell closes your tty (Section 36.15) before reading your .sh_logout file; the `exec < $TTY` reconnects the shell's standard input to your terminal.

Note that if your system is very slow, you may not get the reminder message for a couple of seconds -- consequently, you might forget that it's coming and walk away. That hasn't been a problem where I've tested this. If it is for you, though, replace the `read` `ans` with a program like grabchars that times out and gives a default answer after a while. There may be some Bourne shells that need other tricks -- and others that don't need these tricks -- but this should give you an idea of what to do.

--JP and SJC

Copyright © 2003 O'Reilly & Associates. All rights reserved.