After looking around for a while I've found several good pages describing how to check and see if a bash script is running interactively and there seem to be several methods, but one of them that I keep seeing over and over is checking the variable $- for the presence of i to signify that it is interactive.I'm looking for a way to use an if statement that would work with both /bin/bash and /bin/sh (which is typically aliased to /bin/dash on Ubuntu systems), or in fewer wordsan interactive if test that is universal as possibleFor bash it seems these things should work:Case Statementcase $- in*i*)    echo This shell is interactive ;;*)  echo This shell is not interactive ;;esacIf Statementif [[ $- == *i* ]]then    do_interactive_stufffiBut $- is apparently not set in dash. Possibly because $- is supposed to be the Flags passed to script variable which was originally a ksh construct adopted into Bash, and unfortunately it does not seem to work reliably in Bash scripts... [ for it's intended purpose however] ...One possible use for it is to have a script self-test whether it is interactive.So is there an (relatively simple) if test that can be used both with bash and dash?Or am I just doing it wrong?ps: I have been under the impression that dash is faster than bash, and unless the script needs bash specific functions it would be better to hashbang it as #!/bin/sh and let it use the system-default shell. I get that checking for an interactive shell in the way mentioned above is bash specific but it seems odd to think there is not a more universal way. In the script I'm working on I don't need any other bash-specific functionality.
Can I use an if statement to detect if bash and dash are being run interactively?
bash;shell;shell script;scripting;dash
A very common (if not utterly foolproof) way to check for an interactive terminal is to check whether PS1 is set:if [[ -z $PS1 ]]; then    echo Probably run as a script.else    echo Probably interactive.fiAnother alternative is checking for the i option in $-:case $- in   *i*)       echo Probably interactive       ;;   *)       echo Probably scripted       ;;esacThere is also the -t option for test (aka [ and its cousin, [[):fd=0 # stdinif [[ -t $fd ]]; then    echo Interactiveelse    echo ScriptedfiTip of the hat to the Linux Documentation Project.dash and sh may not have [ and [[ available, so you might have to explicitly use test, e. g.:fd=0if test -t $fd; then  # you might need /path/to/test    echo Interactiveelse    echo ScriptedfiSince test is its own binary, I'm pretty certain that anything using test -t is shell-agnostic.