Bash Check If Shell Is Interactive or Not Under Linux / Unix Oses

Posted on in Categories last updated November 5, 2012

How do I check in GNU/Bash if a shell is running in interactive mode or not while writing shell scripts?

A bash shell is considered as an interactive shell when it reads and writes data from a user’s terminal. Most startup scripts examine the shell variable called PS1. Usually, PS1 is set in interactive shells, and it is unset in non-interactive shells.

Find out if this shell interactive using PS1

The syntax is as follows:

// Is this Shell Interactive?
[ -z "$PS1" ] && echo "Noop" || echo "Yes"

OR


[ -z "$PS1" ] && echo "This shell is not interactive" || echo "This shell is interactive"

OR


[ -z "$PS1" ] && die "This script is not designed to run from $SHELL" 1 || do_interacive_shell_stuff

You can use bash shell if..else..fi syntax as follows:

if [ -z "$PS1" ]; then
       die "This script is not designed to run from $SHELL" 1
else
       //call our function
       do_interacive_shell_stuff
fi

From the bash reference manual

To determine within a startup script whether or not Bash is running interactively, test the value of the ‘-‘ special parameter. It contains i when the shell is interactive. For example:

case "$-" in
    *i*) echo "This shell is interactive" ;;
      *) echo "This shell is not interactive" ;;
esac

tty command

You can also use tty command as follows:

tty -s && echo "This shell is interactive" || echo "This shell is not interactive" ;;

OR

ssh user@server1.cyberciti.biz tty -s && echo "This shell is interactive" || echo "This shell is not interactive" ;;
References:

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on Twitter, Facebook, Google+.

6 comment

  1. Full of holes and not reliable at all. PS1 can be defined by someone in their own .bashrc file for instance.
    You’d have to stat what /dev/fd/0 points to, and sift out the text that is different.

Leave a Comment