我有一份由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?
提前致谢, 唐
答案 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}