4

我有一份由 cron 执行的夜间报告,其中包含以下几行:

PRINTFX="/usr/bin/printf"
<snip>
${PRINTFX} "%-11s %-11s %'d\n" ${F1} ${F2} ${F3}

crontab 条目:

[ca-adm@homwpspect01 ~]$ crontab -l
55      01      *       *       *       /usr/local/sbin/CRONSQLEvents

我的问题是,如果我以 root 身份手动运行它(即使用我的登录环境设置),我会得到这个 [CORRECT] 输出:

Date        Event       Count
2013-02-19  0x00010802  516,616
2013-02-19  0x00010D66  351,840
2013-02-19  0x00010D67  351,533

当 cron 作为另一个用户运行时,我得到 [InCorrect]:

Date        Event       Count
2013-02-19  0x00010802  516616
2013-02-19  0x00010D66  351840
2013-02-19  0x00010D67  351533

如果它由 cron 运行,则数字输出中缺少逗号。我记得读过一些关于 printf 的使用模棱两可的东西,因为有一个 bash 内部函数,但 /usr/bin 中也有一个外部函数:

[root@homwpspect01 sbin]# which printf
printf is a shell builtin
printf is /usr/bin/printf

有人能告诉我如何避免 cron 与登录执行的这个问题吗?特别是考虑到我无论如何都在脚本中指定 /usr/bin/printf ?

在此先感谢,唐

4

2 回答 2

4

打印数字的格式%'d取决于当前的语言环境,而不是(必然)printf您使用的命令。

如果您的脚本与您向我们展示的一样,那么您正在调用/usr/bin/printf.

在我的系统上:

$ echo $LANG
en_US.UTF-8
$ printf "%'d\n" 123456
123,456
$ /usr/bin/printf "%'d\n" 123456
123,456
$ LANG=C printf "%'d\n" 123456
123456
$ LANG=C /usr/bin/printf "%'d\n" 123456
123456
$

Bash 的内置printf/usr/bin/printf(来自 GNU Coreutils)的行为一致。

您可能需要$LANG在脚本中进行设置以获得您想要的行为。

%'d格式记录在GNU libc 手册中:

'

根据为类别指定的区域设置将数字分成组LC_NUMERIC;*注意通用数字::。这个标志是一个 GNU 扩展。

于 2013-02-20T16:40:15.813 回答
0

因此,为了使其正常工作,我将在脚本中添加这一行:

export LANG=en_US.UTF-8
PRINTFX="/usr/bin/printf"
<snip>
${PRINTFX} "%-11s %-11s %'d\n" ${F1} ${F2} ${F3}
于 2013-02-20T17:08:23.103 回答