运行cron bash脚本时出现env问题

时间:2013-02-20 16:33:24

标签: bash cron

我有一份由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?

提前致谢, 唐

2 个答案:

答案 0 :(得分: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以获得所需的行为。

GNU libc manual中记录了%'d格式:

  

'

     

将数字分成指定区域设置指定的组   对于LC_NUMERIC类别; * 注意General Numeric :: 。这个标志是一个   GNU扩展。

答案 1 :(得分:0)

因此,要使其正常工作,我会将此行添加到脚本中:

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