unset a b # readonly a=A b=B readonly b # readonly on already readonly var is harmless: readonly b a readonly | grep '^readonly [ab]=' # this should work: export a b export -n a b echo Ok:$? env | grep -e^a= -e^b= # shows nothing echo # these should all fail (despite the same value being assigned) # bash does not abort even in non-interactive more (in script) true; a=A echo Fail:$? true; readonly a=A echo Fail:$? echo # in bash, assignment in export fails, but export succeeds! :) # we don't mimic that! true; export a=Z echo Fail:$? #env | grep '^a=' #echo "^^^a is exported" export -n a # undo that bashism, if it happens echo export b # this fails to both set and export a: a=Z env | grep '^[ab]=' echo "^^^a is not exported" # but external command does get executed, and $? is not mangled (stays 42): (exit 42); a=Z env echo Visible:$? echo true; unset a echo Fail:$?