How do I ensure that there are no unexpected functions inherited from the parent when my script is run? If using bash,
#!/bin/bash -p
will do the trick, as will invoking the script through env -i. But I cannot rely on the user to invoke env, I don’t want to rely on bash, I don’t want to do an exec-hack and re-exec the script, and
#!/usr/bin/env -i sh
does not work.
So I’m looking for a portable way (portable == posix) to ensure that the user hasn’t defined functions that will unexpectedly modify the behavior of the script. My current solution is:
eval $( env | sed -n '/\([^=]*\)=(.*/s//\1/p' |
while read -r name; do echo unset -f $name\;; done )
but that’s pretty ugly and of dubious robustness. Is there a good way to get the functionality that ‘unset -f -a’ should provide?
edit
Slightly less ugly, but no better (I don’t like parsing the output of env):
unset -f $( env | sed -n '/\([^=]*\)=(.*/s//\1/p' | tr \\012 \ )
results in:
same as:
and “sh” is posix…
EDIT:
tested a few functions – unset was not required in my case…
EDIT2:
compare output of “set”, not just “env”
EDIT3:
the following example – output of both “set|wc” also gives same results: