ksh93がAIXで組み込みprintfの%Tフォーマット指定子をサポートしていないのはなぜですか?

ksh93がAIXで組み込みprintfの%Tフォーマット指定子をサポートしていないのはなぜですか?

複数のAIX 5.3/6.1システムでksh93を使用して以下のコマンドをテストしましたが、printfすべて同じ結果で失敗しました。

なぜそんなことですか?

# 
# oslevel -s                               
6100-07-09-1341
# 
# 
# ksh93 -c 'echo ${.sh.version}'
Version M-12/28/93e
# 
# 
# ksh93 -c 'printf "%T\n" "now"'      
ksh93[1]: printf: T: unknown format specifier
# 
# 

ベストアンサー1

%Tprintf1999年にリリースされたksh93hのkshに追加されました。

参考にしてくださいhサフィックス(ある部分e)はksh93のバージョンを表します。

AT&Tのksh93の最新バージョンは2012年にリリースされたksh93u+です。発展はコミュニティの共同努力であるhttps://github.com/ksh93/kshこの記事を書く時点で、最新バージョンは2023年6月にリリースされたksh93u + m 1.0.6であり、何百ものバグを修正するので、このバージョンに切り替えることをお勧めします。

ksh93eは1996年にリリースされた古い製品で、AIX 5.3または6.1(どちらもEOL AFAICT)よりはるかに古くなっています。

運が良ければ、組み込みdate機能はksh93バージョンに含まれています(ksh93がオープンソースになる前であるため、ksh93eで使用できるかどうかはわかりません)。この場合、次のことができます。

builtin date
date -d now '+the format you need: %FT%T%z for instance'

date -d同じ日付/時刻仕様を受け入れますprintf %Tが、文書化されていませんが、いくつかの例を見つけることができます。ast-open sourceに含まれるテストファイルから)の代わりに:

printf '%(format)T %<other-directive>' \
  some-time-spec \
  other-arg

あなたはこれを行います:

builtin date
printf '%s %<other-directive>' \
  "${ date -d some-time-spec +format; }" \
  other-arg

Bashは4.2(2011)に追加されました。%Tこれはprintf、互換性のない方法でksh93機能のサブセットを実装します。

nowksh93などの日付の解析はサポートされていません。唯一サポートされているパラメータは次のとおりです。

強く打つ ksh93相当 説明する
123456789 #123456789 あらゆる時代の時間
-1² nowまたは'' 現在時刻
-2 3番 シェル開始時間

zshはstrftime2003年にリリースされた4.1.1に組み込み日付形式を追加しました。これはAIX 5.3と同期する必要があり、別のオプションになる可能性があります。

現在時刻の形式はksh93のデフォルト形式と似ています%T

$ zmodload zsh/datetime
$ strftime '%a %b %e %T %Z %Y' $EPOCHSECONDS
Mon Jul 24 15:10:15 BST 2023

strftime -rただし、解析時間は4.3.3(2007)でのみ追加されました(AIX 6.1と同時)。strptime()


1 bashでは整数しかできませんが、ksh93では小数部(.ロケールに関係なく基数文字)を持つことができます。

²5.0以降、bashには$EPOCHSECONDS現在使用可能な特殊変数(zshからコピー)があります。

³スクリプトの先頭には常に時間を記録できますが、starttime=${ printf '#%(%s.%N)T' now; }

おすすめ記事