#!/bin/bash rm -f savedenv myenv() { env -i bash -c ' [[ -f ./savedenv ]] && . ./savedenv for __blah do eval "${__blah}" done ( declare -f declare -p | awk '\''$2 !~ /r/'\'' printf "cd %q\n" "$PWD" printf "set -%q\n" "${-//c}" ) >./savedenv ' -- "$@" } myenv 'f() { echo "inside: $a"; }' a=27 myenv 'a=43' myenv 'f' '((a++)); f' echo "outside: $a" # bash 4 only (don't know why) # expected output: # inside: 43 # inside: 44 # outside: 27