Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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.

share|improve this question
up vote 24 down vote accepted

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* ]]


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.

share|improve this answer
Note that $- may contain an i, not necessarily equal it. I use [[ $- =~ i ]] && echo interactive – Alex Howansky Feb 27 '13 at 14:47
@AlexHowansky: the asterisks in the equality test make it a test for containing i – Dennis Williamson Feb 27 '13 at 18:17
Oh wow didn't even notice those, they look like double quotes on my monitor. It may be time to up the font size. <getting old> – Alex Howansky Feb 28 '13 at 14:29
Sometimes, people source it from ~/.bash_profile or ~/.profile which is incorrect since it interferes with the expected behavior Right. What do you think of sourcing ~/.bashrc from ~/.bash_login? As login shell needn't to to be interactive I guess it's incorrect, too. – Piotr Dobrogost Mar 5 '14 at 20:44
@PiotrDobrogost: This is an excellent discussion of shell startup files. – Dennis Williamson Mar 6 '14 at 2:11

I typically look at the output of the program tty.

If you're on a tty, it will tell you which tty you're on. If you're not in interactive mode, it will typically tell you something like "not a tty".

share|improve this answer
tty -s will set a return value of 0 if you are on a terminal or 1 otherwise without giving you output. You can use it as 'if tty -s; then _interactive; fi' – BillThor May 31 '10 at 1:31
Thanks! It's been a long time since I've needed to do this sort of thing and I guess I forgot some of the details... – chris May 31 '10 at 11:13


if tty -s; then echo interactive; fi
share|improve this answer
Doesn't seem to work – Steven Shaw Jun 16 '15 at 7:16

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


if [ -t 1 ] ; then
    echo stdout is a terminal
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.