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.
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
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.
~/.bashrc is only sourced for interactive shells. Sometimes, people source it from
~/.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
~/.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.
if tty -s; then echo interactive; fi
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
if [ -t 1 ] ; then echo stdout is a terminal fi
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".