问题说明了一切。我目前使用 Arch Linux 和 zsh,但我想要一个(至少)既适用于 VT 又适用于 xterm 的解决方案,并且(希望最好)在我切换发行版或 shell 时仍能继续工作。
我在不同发行版的文档中听到了对这个问题截然不同的答案。Ubuntu 说“使用 .pam_environment”。我认为在 Arch 中,他们推荐的内容取决于您的外壳。目前,我将所有内容都放在.profile 中,如果由于某种原因 shell 没有提供它(例如,如果 .bash_profile 存在则为 bash),我会通过手动获取它来覆盖它。但似乎必须有更好的方法。
Collation order throughLC_COLLATE
不仅定义了单个字符的排序顺序,还定义了字符范围的含义。或者是吗?考虑以下片段:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Run Code Online (Sandbox Code Playgroud)
直观地说,B
不是 in [a-z]
,所以这不应该输出任何东西。这就是 Ubuntu 8.04 或 10.04 上发生的事情。但是在一些运行 Debian lenny 或挤压的机器上,B
可以找到,因为范围a-z
包括排序顺序之间a
和z
排序顺序中的所有内容,包括大写字母B
到Z
.
所有测试的系统都en_US
生成了语言环境。我还尝试改变语言环境:在B
上面匹配的机器上,{en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}
除了日语(任何可用的编码)和C
/之外的每个可用语言环境(主要基于拉丁语:,还有中文语言环境)都会发生同样的情况POSIX
。
当您超越 ASCII 时,字符范围在正则表达式中意味着什么?为什么一方面某些 Debian 安装与其他 Debian 安装和 Ubuntu 之间存在差异?其他系统的行为如何?谁是对的,谁应该报告错误?
(请注意,我特别询问字符范围的行为,例如[a-z]
在en_US
语言环境中,主要是在基于 GNU libc 的系统上。我不是在询问如何匹配小写字母或 ASCII 小写字母。)
在两台 Debian 机器上,一台B
在[a-z]
,一台不在,输出LC_COLLATE=en_US …
通常,bash globbing 区分大小写:
$ echo c*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo C*
CarePackage.md ChocRippleCake.md Clips
Run Code Online (Sandbox Code Playgroud)
使用方括号似乎不会改变这一点:
$ echo [c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C]*
CarePackage.md ChocRippleCake.md Clips
Run Code Online (Sandbox Code Playgroud)
如果使用连字符,它仍然不会改变它:
$ echo [c-c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C-C]*
CarePackage.md ChocRippleCake.md Clips
Run Code Online (Sandbox Code Playgroud)
但是字母是穿插的:
$ echo [B-C]*
CarePackage.md casefix.pike cdless chalices.py charconv.py chocolate.pike ChocRippleCake.md circum.py clip.pike Clips cpustats.pike crop.pike cwk2txt.py
$ …
Run Code Online (Sandbox Code Playgroud) 我们正在使用几台以英语为工作语言的 Ubuntu 服务器;但是,在机器中设置了 en_US 语言环境后,我们会遇到 apt-cacher-ng 下载翻译文件的问题。一种解决方案是将语言环境更改为 POSIX。考虑到我们希望在所有系统中更改区域设置的所有选项。
将语言环境从 en_US 值更改为 POSIX 的系统会产生什么后果?除了值的变化之外,对 LC_* 有什么影响吗?
我想从带有叙利亚文字的文件中删除重复的行。源文件有 3 行,第 1 行和第 3 行相同。
$ cat file.txt
????
????
????
Run Code Online (Sandbox Code Playgroud)
当我使用sort
and 时uniq
,结果假定所有 3 行都相同,这是错误的:
$ cat file.txt | sort | uniq -c
3 ????
Run Code Online (Sandbox Code Playgroud)
将语言环境显式设置为叙利亚语也无济于事。
$ LC_COLLATE=syr_SY.utf8 cat file.txt | sort | uniq -c
3 ????
Run Code Online (Sandbox Code Playgroud)
为什么会这样?如果重要的话,我正在使用 Kubuntu 18 和 bash。
在 Python 3 中,有没有办法找出系统使用的语言?
即使是一个棘手的一个,虽然,这样的:从文件中读取偷偷摸摸目录,并找到字符串'ENG'
或'FRE'
文件的内容中...
我想在 FreeBSD 上创建一个新的语言环境。我以为我可以只复制现有的其中之一,/usr/share/locale
但显然它并不那么简单。
首先,我只是创建了en_US.UTF-8
语言环境的副本。
$ sudo cp -R /usr/share/locale/en_US.UTF-8 /usr/share/locale/en_DK.UTF-8
Run Code Online (Sandbox Code Playgroud)
我正在用 mosh 测试我的设置,所以使用标准en_US.UTF-8
一切都很好:
$ LC_ALL=en_US.UTF-8 PATH_LOCALE=/usr/share/locale mosh xyz.example.org
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用新创建的en_DK.UTF-8
语言环境,则会出现以下错误:
$ LC_ALL=en_DK.UTF-8 PATH_LOCALE=/usr/share/locale mosh xyz.example.org
The locale requested by LC_ALL=en_DK.UTF-8 isn't available here.
Running `locale-gen en_DK.UTF-8' may be necessary.
mosh-server needs a UTF-8 native locale to run.
Unfortunately, the local environment ([no charset variables]) specifies
the character set "US-ASCII",
The client-supplied environment (LC_ALL=en_DK.UTF-8) specifies
the character set "US-ASCII".
sh: warning: setlocale: LC_ALL: cannot …
Run Code Online (Sandbox Code Playgroud)