What?

To leverage DB2 commands from a *nix environment, you typically append the following to your shell profile script:

. /path/to/db2/sqllib/db2profile

But, if you try that in zsh, you get the lovely errors:

zsh: awk: command not found...
AddRemoveString:12: command not found: awk
zsh: sed: command not found...
AddRemoveString:14: command not found: sed
zsh: sed: command not found...
AddRemoveString:18: command not found: sed
zsh: awk: command not found...
AddRemoveString:12: command not found: awk
zsh: sed: command not found...
AddRemoveString:14: command not found: sed
zsh: sed: command not found...
AddRemoveString:18: command not found: sed
zsh: awk: command not found...
AddRemoveString:12: command not found: awk
zsh: sed: command not found...
AddRemoveString:14: command not found: sed
zsh: sed: command not found...
AddRemoveString:18: command not found: sed
zsh: awk: command not found...
AddRemoveString:12: command not found: awk
zsh: sed: command not found...
AddRemoveString:14: command not found: sed

And worse, you completely lost everything in $PATH. Due to differences between the Bourne shell and the Z shell, the AddRemoveString function in db2profile splits your path variables in a way it can't recombine.

So how can I fix it?

Luckily, there's an easy fix I've come up with. First, I copy db2profile to db2profile.zsh, then towards the bottom of AddRemoveString I add a line that replaces the newlines in the path variable with the correct delimiter:

In the end, it looks like this:

AddRemoveString()
{
    if [ $# -ne 3 ]; then
       return 0
    fi
    var=$1        #The enviornment variable to be processed
    addrm_str=$2  #The new path to be used
    action=$3     #Action: a -> add, r -> remove
    if [ "X${action?}" != "Xa" -a "X${action?}" != "Xr" ]; then
        return 0  # return without doing anything
    fi
    awkval='$1 != "'${addrm_str?}'"{print $0}'
    newval=`eval echo \\${$var:-""} | awk '{for (i=1; i<= NF; ++i) \
          if( $i != VAR && length($i) > 0 ) print $i":"}' FS=":" VAR=${addrm_str?}`
    newval=`echo ${newval?} | sed 's/\: /\:/g'`
    if [ "X${action?}" = "Xa" ]; then
        newval=${newval?}"${addrm_str?}"
    else
        newval=`echo ${newval?} | sed 's/:$//'`
    fi
+   newval=`echo ${newval?} | tr '\n' ':'`
    eval $var=\"${newval?}\"
    unset var addrm_str awkval newval
}

That line marked with a + is the line added (make sure to remove the + if you copy/paste).

Then, just update your .zshrc with:

. /path/to/db2/sqllib/db2profile.zsh

That's it!