So, you get this annoying error (in Debian, some Ubuntu, or perhaps any other Linux or even Unix system):
locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory
Perhaps you get it when running apt-get?
You Google for answers and you find nothing useful and/or just contradictory information?
You are connecting over SSH?
You are connecting from another system (like Mac OS X)?
Read on…
In it simplest incarnation, the problem looks like this.
$ man some-none-existing-program man: can't set the locale; make sure $LC_* and $LANG are correct No manual entry for some-none-existing-program $ locale locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory LANG=en_US.UTF-8 LANGUAGE=en_GB:en LC_CTYPE=UTF-8 LC_NUMERIC=sv_SE.UTF-8 LC_TIME=sv_SE.UTF-8 LC_COLLATE="en_US.UTF-8" LC_MONETARY=sv_SE.UTF-8 LC_MESSAGES="en_US.UTF-8" LC_PAPER=sv_SE.UTF-8 LC_NAME=sv_SE.UTF-8 LC_ADDRESS=sv_SE.UTF-8 LC_TELEPHONE=sv_SE.UTF-8 LC_MEASUREMENT=sv_SE.UTF-8 LC_IDENTIFICATION=sv_SE.UTF-8 LC_ALL=
What happens here, in the second case is that “UTF-8” is not a valid LC_CTYPE (in Debian) and since LC_ALL is not set it can not fall back properly. That is all. Why is LC_CTYPE invalid? Perhaps because you have used ssh from Mac OS X (or something else):
mac $ locale LANG= LC_COLLATE="C" LC_CTYPE="UTF-8" LC_MESSAGES="C" LC_MONETARY="C" LC_NUMERIC="C" LC_TIME="C" LC_ALL= mac $ ssh user@debianhost
The point is, here LC_CTYPE=UTF-8, and it is valid in OS X. But it is not valid in Debian. That is all there is to it. Try:
# This will fix the problem mac $ LC_CTYPE=en_US.UTF-8 ssh user@debianhost # This will produce the problem even from a Debian machine debianclient $ LC_CTYPE=UTF-8 ssh user@debianhost # This will (kind of) eleminate the problem when already logged in $ LC_CTYPE=en_US.UTF-8 locale -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8) LANG=en_US.UTF-8 LANGUAGE=en_GB:en LC_CTYPE=en_US.UTF-8 LC_NUMERIC=sv_SE.UTF-8 LC_TIME=sv_SE.UTF-8 LC_COLLATE="en_US.UTF-8" LC_MONETARY=sv_SE.UTF-8 LC_MESSAGES="en_US.UTF-8" LC_PAPER=sv_SE.UTF-8 LC_NAME=sv_SE.UTF-8 LC_ADDRESS=sv_SE.UTF-8 LC_TELEPHONE=sv_SE.UTF-8 LC_MEASUREMENT=sv_SE.UTF-8 LC_IDENTIFICATION=sv_SE.UTF-8 LC_ALL=
So, the problem is that all the guides on the internet presume you have a problem with your locales on your server, which you dont! The locale is probably fine. It is just that the ssh client computer has an LC_CTYPE which does not happen to be valid on the server.
The Debian Locale guide itself is of course correct. And it states that you should not set LC_ALL=en_US.UTF-8 (!). That is however the only “working” answer I found online.
Solution
I guess the easiest thing is to add a line to your .profile file (on the server):
$ cat .profile . . . LC_CTYPE="en_US.UTF-8"
If you are not using a bourne-shell you probably know how to set a variable for your shell. Any other method that will set LC_CTYPE to a locale valid on your Debian machine will also work. Clearly, you dont need (and you probably should not) set LC_ALL.
Not happy with en_US.UTF-8?
Not everyone use the American locale. To find out what locales are available/valid on your system:
$ locale -a C C.UTF-8 en_GB.utf8 en_US.utf8 POSIX sv_SE.utf8
Want others?
$ sudo dpkg-reconfigure locales
or read the Debian Locale Guide.
You sir, are my hero. 99% of the solutions offered are indeed bogus, it was OSX screwing things up. THANKS!
Thanks!
I figured this issue out a few years ago. So since then i’m using the following in my Mac’s .bash_profile.
—-
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
—-
However since a few months (or Yosemite) this doesn’t help anymore.
I’ll added you’re LC_CTYPE suggestion, hope this helps.
Kind regards,
Nick