根据LANG environ变量,bash 3.2.25 printf内部命令的奇怪行为

时间:2018-03-21 14:40:40

标签: bash printf

我的脚本包含

#!/bin/bash

echo before: LANG=$LANG LC_NUMERIC=$LC_NUMERIC
unset LANG LC_NUMERIC
echo after: LANG=$LANG LC_NUMERIC=$LC_NUMERIC

printf "%f\n" .34

当我在RHEL 6(bash 4.1.2)中运行此脚本时,它按预期工作:

before: LANG=es_ES.UTF-8 LC_NUMERIC=
after: LANG= LC_NUMERIC=
0.340000

但是当它在RHEL 5(bash 3.2.25)中运行时,printf似乎忽略了缺少 LANG 环境变量并报告错误消息,因为它希望找到逗号()而不是点()作为小数分隔符:

before: LANG=es_ES.UTF-8 LC_NUMERIC=
after: LANG= LC_NUMERIC=
./myscript.sh: line 7: printf: .34: invalid number
0,000000

当我在启动脚本之前摆脱LANG环境变量时它起作用:

$ unset LANG
$ sh myscript.sh
LANG= LC_NUMERIC=
LANG= LC_NUMERIC=
0.340000

我总是在脚本的开头使用unset LANG来防止这种副作用;但是,在这种情况下,似乎没有工作。

这是一个错误吗?

由于

1 个答案:

答案 0 :(得分:0)

我可以在bash 4.4上重现你的问题。您可能设置了LC_ALLLC_ALL 假设以覆盖LANG

设置LC_ALL

echo before: LANG=$LANG LC_NUMERIC=$LC_NUMERIC
unset LANG LC_NUMERIC
LC_ALL=es_ES.UTF-8
echo after: LANG=$LANG LC_NUMERIC=$LC_NUMERIC

printf "%f\n" .34

给出:

./gash.sh: line 8: printf: .34: invalid number
0,000000

这只是设置LANG

LANG=es_ES.UTF-8
echo before: LANG=$LANG LC_NUMERIC=$LC_NUMERIC
unset LC_ALL LC_NUMERIC
echo after: LC_ALL=$LC_ALL LC_NUMERIC=$LC_NUMERIC

printf "%f\n" .34

给出:

before: LANG=es_ES.UTF-8 LC_NUMERIC=
after: LC_ALL= LC_NUMERIC=
./gash.sh: línea 8: printf: .34: número inválido
0,000000

但是这个取消了两者:

LANG=es_ES.UTF-8
echo before: LANG=$LANG LC_NUMERIC=$LC_NUMERIC
unset LANG LC_ALL LC_NUMERIC
echo after: LANG=$LANG LC_ALL=$LC_ALL LC_NUMERIC=$LC_NUMERIC

printf "%f\n" .34

给出:

before: LANG=es_ES.UTF-8 LC_NUMERIC=
after: LANG= LC_ALL= LC_NUMERIC=
0.340000

所以,取消设置LANG LC_ALL