使用seq
带有浮点数的命令,尽管在输入中使用了点,但我的输出还是以逗号而不是点作为小数分隔符:
seq 0.1 0.3 1.3
0,1
0,4
0,7
1,0
1,3
我认为这与 locale 链接LC_NUMERIC
,该 locale 设置为de_DE.UTF-8
,但是更改为en_US.UTF-8
并没有修复它,并且我使用完全相同的区域设置的另一个系统确实返回点。即使通过例如显式定义格式-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
不影响结果。
答案1
为了排除语言环境本身的错误,我(重新)生成了de_DE.UTF-8
和en_US.UTF-8
通过
dpkg-reconfigure locales
现在seq
行为似乎取决于LC_NUMERIC
和 LANG
。
如果LC_NUMERIC
未设置/为空,则LANG
定义行为,否则分别LC_NUMERIC
在逗号和点之间de_DE.UTF-8
切换。en_US.UTF-8
具体危险
LANG
在为和 非基于点设置错误/不存在的值的情况下locale
,在某些特殊情况下行为可能会混合,例如
LANG=en_US
#it should be en_US.UTF-8
LC_NUMERIC=de_DE.UTF-8
seq 0.1 0.2 1.3
0.1
0.3
0.5
0.7
0.9
1.1
1,3
它不仅出现,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