Fel*_*xJN 6 terminal shell-script seq floating-point
使用seq
带有浮点数的命令,我的输出带有逗号而不是点作为小数点分隔符,尽管在输入中使用了点:
seq 0.1 0.3 1.3
0,1
0,4
0,7
1,0
1,3
Run Code Online (Sandbox Code Playgroud)
我假设这与 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=
Run Code Online (Sandbox Code Playgroud)
“点”一:
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=
Run Code Online (Sandbox Code Playgroud)
设置LANGUAGE
不影响结果。
为了排除语言环境本身的错误,我(重新)生成de_DE.UTF-8
和en_US.UTF-8
通过
dpkg-reconfigure locales
Run Code Online (Sandbox Code Playgroud)
现在seq
行为似乎取决于LC_NUMERIC
AND LANG
。
如果LC_NUMERIC
未设置/空的,LANG
限定了bahaviour否则切换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
Run Code Online (Sandbox Code Playgroud)
它不会出现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