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.
Tutorial details | |
---|---|
Difficulty | Easy (rss) |
Root privileges | No |
Requirements | GNU/Bash |
Time | N/A |
Find out if this shell interactive using PS1
The syntax is as follows:
// Is this Shell Interactive? [ -z "$PS1" ] && echo "Noop" || echo "Yes"
Here is another shortcut for us:
[ -z "$PS1" ] && echo "This shell is not interactive" || echo "This shell is interactive" ## do some stuff or die ## [ -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
Is this shell interactive?
From the bash(1) 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:
So we can use the case..in..esac (bash case statement)
case "$-" in *i*) echo This shell is interactive ;; *) echo This shell is not interactive ;; esac
OR we can use the if command:
if [[ $- == *i* ]] then echo "I will do interactive stuff here." else echo "I will do non-interactive stuff here or simply exit with an error." fi
Check in bash if a shell is running in interactive mode using the 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" ;;
Use the test command
As per the comment, we can use the test command too:
-t FD file descriptor FD is opened on a terminal
Hence, we can use the following code snippet:
if [ -t 0 ] ; then echo "Doing interactive stuff here in my bash script ..." else echo "Error ..." fi
Conclusion
You leaned how to check in GNU/bash if a shell is running in interactive mode or not using various command line options. See GNU/bash man page by typing the following bash command or by visiting this url:
man bash
🐧 6 comments so far... add one ↓
Category | List of Unix and Linux commands |
---|---|
File Management | cat |
Firewall | Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04 |
Network Utilities | dig • host • ip • nmap |
OpenVPN | CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04 |
Package Manager | apk • apt |
Processes Management | bg • chroot • cron • disown • fg • jobs • killall • kill • pidof • pstree • pwdx • time |
Searching | grep • whereis • which |
User Information | groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w |
WireGuard VPN | Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04 |
Whatever happened to the standard method of checking the fd ‘0’ ???
if [ -t 0 ]; then
# do stuff
fi
Don’t you think that’s a better check that some env variable?
that will miss the action on a fresh login.
Hi,
Very useful article
Thanks a lot..
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.
@ Mike – what other solution do you propose, if -t 0 isn’t enought, nor is [ -z “$PS1” ]
Hi,
How can I create a user with non-interactive shell?
Is it just a matter of:
useradd -s /sbin/nologin lisa
Thanks