Browse Source

Add bash scoping tests

George Jones 1 year ago
parent
commit
04b2751785
1 changed files with 78 additions and 0 deletions
  1. 78 0
      home/public/snippits/bash/scoping.sh

+ 78 - 0
home/public/snippits/bash/scoping.sh

@@ -0,0 +1,78 @@
+#! /bin/bash
+# explore/demonstrate scoping in bash
+
+unset FOO
+
+#
+# Testing scoping of variables to/from functions
+#
+
+
+# Q: Do functions inherit variables from outer scope?
+#
+FOO=FOO-outside
+function baz { echo FOO is $FOO; }
+baz
+# output is "FOO-outside".
+#
+# A: yes.  $FOO comes from outer scope
+
+# Q: when does variable expansion happen
+#
+FOO=FOO-outside2
+baz
+# output is "FOO-outside2"
+#
+# A: expansion of $FOO hapens at baz runtime, not when defined.
+
+# Q: are variables global?
+#
+function blort { FOO=foo-inside; echo FOO inside is $FOO; }
+echo $FOO
+# FOO is "inside before calling the function"
+blort
+# ouput is "FOO inside is foo-inside"
+echo $FOO
+# output is "foo-inside"
+#
+# A: scope of of variableis global
+
+#
+# Exporting variables to subshells
+#
+$ export -p | grep FOO
+$ # FOO is not exported
+
+$ FOO=bar
+$ export -p | grep FOO
+$ # FOO is still not exported
+
+$ export FOO=baz
+$ export -p | grep FOO
+declare -x FOO="baz"
+# Q: but as we see below, non-exported variables are
+#    inherited by subproceses (probably as a conseuqence
+#    of fork(2).  When are exports neeed?
+
+
+#
+# Testing scoping of varibles in subshells
+#
+
+# Q: are variable in a sub-shell local to that shell?
+unset FOO
+FOO=bar
+function blort {
+    (
+        echo FOO inside blort is $FOO;
+        FOO=foo-inside;
+        echo FOO inside blort is $FOO after setting
+    )
+}
+blort
+echo FOO outside blort after call to baz is $FOO
+# A: yes. FOO did not change outside the function.
+#
+# Commentary.  This seems like a "safe" way to
+#   lmit namespace pollution and side-effects in bash,
+#   as long as you don't find the fork/exec overhead.