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として手動で(つまり、ログイン環境設定を使用して)実行すると、次の[正しい]出力が得られることです。

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で実行されている場合、数値出力からコンマが欠落しています。bashの内部関数があるため、printfの使用があいまいであるということを読んだことを覚えていますが、/ 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カテゴリに指定されたロケールで指定されているように、数字をグループに分けます。※注意 General Numeric:: . このフラグは GNU 拡張です。

于 2013-02-20T16:40:15.813 に答える