How can I check in bash if a shell is running in interactive mode?
How can I tell (in ~/.bashrc
) if I'm running in interactive mode, or, say, executing a command over ssh. I want to avoid printing of ANSI escape sequences in .bashrc
if it's the latter.
According to man bash
:
PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to test this state.
So you can use:
if [[ $- == *i* ]]
then
do_interactive_stuff
fi
Also:
When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist.
So ~/.bashrc
is only sourced for interactive shells. Sometimes, people source it from ~/.bash_profile
or ~/.profile
which is incorrect since it interferes with the expected behavior. If you want to simplify maintenance of code that is common, you should use a separate file to contain the common code and source it independently from both rc files.
It's best if there's no output to stdout from login rc
files such as ~/.bash_profile
or ~/.profile
since it can interfere with the proper operation of rsync
for example.
In any case, it's still a good idea to test for interactivity since incorrect configuration may exist.
the test
tool can check for this (from the man page):
-t FD True if FD is opened on a terminal.
So you can use for example:
if [ -t 0 ] ; then
echo stdin is a terminal
.....
fi
or
if [ -t 1 ] ; then
echo stdout is a terminal
fi