Just to give a simple example: x.sh: char=ä printf '%s' "$char" | hd byte="$( printf '\244' )" printf '%s' "$byte" | hd printf '%s' "${char%$byte}" | hd $ LC_ALL=en_US.UTF-8 bash x.sh 00000000 c3 a4 |..| 00000002 00000000 a4 |.| 00000001 00000000 c3 |.| 00000001 $ LC_ALL=C bash x.sh 00000000 c3 a4 |..| 00000002 00000000 a4 |.| 00000001 00000000 c3 |.| 00000001 $ dash x.sh 00000000 c3 a4 |..| 00000002 00000000 a4 |.| 00000001 00000000 c3 |.| 00000001 but: $ LC_ALL=en_US.UTF-8 zsh x.sh 00000000 c3 a4 |..| 00000002 00000000 a4 |.| 00000001 00000000 c3 a4 |..| 00000002 $ LC_ALL=C zsh x.sh 00000000 c3 a4 |..| 00000002 00000000 a4 |.| 00000001 00000000 c3 |.| 00000001 Again, not saying that this means dash shouldn't support other locales... but people may (of course wrongly) rely on the behaviour that dash is always in the C locale. Even if that doesn't change right now with the fnmatch() implementation, it could in principle do so with any change there. Ceers, Chris.