Skip to content

Instantly share code, notes, and snippets.

@aks
Created November 22, 2018 18:34
Show Gist options
  • Select an option

  • Save aks/65b577c1ef619790e6d88d788c561177 to your computer and use it in GitHub Desktop.

Select an option

Save aks/65b577c1ef619790e6d88d788c561177 to your computer and use it in GitHub Desktop.
Exploration of bash interactivity, SHLVL and `-t 1` values in various forms of invocation
#!/usr/bin/env bash
case "$-" in
*i*) echo 'interactive' ;;
*) echo 'non-interactive' ;;
esac
echo "SHLVL = $SHLVL"
[[ -t 1 ]] && echo "tty STDOUT? : true" || echo "tty STDOUT? : false"
$ ./tstl.sh
Sourcing a script
source ./tst.sh :
non-interactive
SHLVL = 2
tty STDOUT? : true
Invoking a script
./tst.sh :
non-interactive
SHLVL = 3
tty STDOUT? : true
Invoking a script within a string
echo `./tst.sh` :
non-interactive SHLVL = 3 tty STDOUT? : false
Sourcing a script within a subshell
( source ./tst.sh ) :
non-interactive
SHLVL = 2
tty STDOUT? : true
Invoking a script within a subshell
( ./tst.sh ) :
non-interactive
SHLVL = 3
tty STDOUT? : true
Invoking a script within a string within a subshell
( echo `./tst.sh` ) :
non-interactive SHLVL = 3 tty STDOUT? : false
Evaluating a script invocation within a string
eval "echo \`./tst.sh\`" :
non-interactive SHLVL = 3 tty STDOUT? : false
Evaluating a script invocation within a string, in a subshell
( eval "echo \`./tst.sh\`" ) :
non-interactive SHLVL = 3 tty STDOUT? : false
#!/usr/bin/env bash
prog=./tst.sh
echo "Sourcing a script"
echo "source $prog :"
source $prog
echo ''
echo "Invoking a script"
echo "$prog :"
$prog
echo ''
echo "Invoking a script within a string"
echo "echo \`$prog\` :"
echo `$prog`
echo ''
echo "Sourcing a script within a subshell"
echo "( source $prog ) :"
( source $prog )
echo ''
echo "Invoking a script within a subshell"
echo "( $prog ) :"
( $prog )
echo ''
echo "Invoking a script within a string within a subshell"
echo "( echo \`$prog\` ) :"
( echo `$prog` )
echo ''
echo "Evaluating a script invocation within a string"
echo "eval \"echo \\\`$prog\\\`\" : "
eval "echo \`$prog\`"
echo ''
echo "Evaluating a script invocation within a string, in a subshell"
echo "( eval \"echo \\\`$prog\\\`\" ) :"
( eval "echo \`$prog\`" )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment