I wrote a random password generator shell script, the core of which is this one-liner:

dd if=/dev/urandom bs=1 count=256 2>/dev/null | tr -dc 'A-Za-z0-9!@$%^&*(){}[]=+-_/?\|~`' | head -c 32

The very ugly string 'A-Za-z0-9!@$%^&*(){}[]=+-_/?\|~`' is the ALLOWED values.  The two counts are replaced by variables, the first 'count=' needing to be a lot bigger than the final '-c <number>' which is the length of the password generated.  The size difference is necessary because 'tr' throws away a lot of values.

I've never had a problem with this on Linux, but on a Mac under some circumstances we get:

    tr: Illegal byte sequence

My coworker, who's also using the script, always got that error.  It seems to come down to locale settings.  Mine by default are:

$ locale
LANG="en_CA.UTF-8"
LC_COLLATE="en_CA.UTF-8"
LC_CTYPE="en_CA.UTF-8"
LC_MESSAGES="en_CA.UTF-8"
LC_MONETARY="en_CA.UTF-8"
LC_NUMERIC="en_CA.UTF-8"
LC_TIME="en_CA.UTF-8"
LC_ALL=

My co-worker's settings are:

LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

A reliable fix (so far ...):

    $ export LC_CTYPE=C
    $ export LC_ALL=C
    $ dd if=/dev/urandom bs=1 count=256 2>/dev/null | tr -dc 'A-Za-z0-9!@$%^&*(){}[]=+-_/?\|~`' | head -c 32
    z%V;d9uZfWLTgsT*J]Bz`mAmA

I'd really like to understand what the problem is, why 'tr' barfs, and what the 'locale' settings have to do with this.  Thanks.

(Should anyone have arguments against this as a method of password generation, I'll entertain those too.  And yes, I'm aware of 'apg' but it's not readily available for Mac and this is much lighter weight.)