使用seq
带有浮点数的命令,我的输出带有逗号而不是小数点分隔符,尽管在输入中使用了点:
seq 0.1 0.3 1.3
0,1
0,4
0,7
1,0
1,3
我假设这与设置为 的 locale 相关联LC_NUMERIC
,de_DE.UTF-8
但是更改为en_US.UTF-8
并没有修复它,并且我使用相同语言环境设置的另一个系统确实返回点。即使通过 eg 明确定义格式-f %1.2
也不会返回点,而是将逗号作为小数分隔符。
我在哪里以及如何改变这种行为?如何确保我的脚本在任何给定系统上都不会出错?tr
显然,如果不通过类似方法重新处理,任何输出都将无法用于进一步处理。
在德国时区使用 Mint 的英文安装,在另一台机器上使用 raspian。
编辑:locale
给定机器上的设置:
“逗号”之一:
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
“点”之一:
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="C.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
设置LANGUAGE
不影响结果。
为了排除语言环境本身的错误,我(重新)生成了
de_DE.UTF-8
和en_US.UTF-8
通过现在
seq
行为似乎取决于LC_NUMERIC
ANDLANG
。如果
LC_NUMERIC
未设置/为空,则LANG
定义行为,否则分别在逗号和点之间LC_NUMERIC
切换de_DE.UTF-8
和切换。en_US.UTF-8
具体危险
LANG
在为和非基于点的值设置错误/不存在的locale
情况下,在某些特殊情况下可能会混合行为,例如它没有出现,
seq 0.1 0.2 1.4
但也出现seq 0.1 0.2 1.9
- 非常奇怪和恕我直言非常危险的行为。因此,请注意seq
任何脚本的可移植性或定义语言环境。疯狂猜测,这似乎与特定情况下的一些手动更改有关(参见:https ://lists.gnu.org/archive/html/bug-coreutils/2008-09/msg00192.html )
更新:
维护者建议避免由于本地化输出格式而导致的任何错误,是在脚本本身中定义语言环境 (
LC_NUMERIC=C
)。没有计划更改此行为。(请参阅下面带有补丁的链接线程)由于错误的语言环境设置导致混合点和逗号输出的问题已被确认为错误并已由维护人员修补:
https://lists.gnu.org/archive/html/coreutils/2019-02/msg00002.html