My guess is that the environment setup 'su' does for the child process includes something of the form TZ=$yourtz without quotes around the variable! All I can suggest is that you create some cute front end shell script like TZ='"'$TZ'"' exec /bin/su $* and use that instead of 'su'. It should fool the child's shell.