シェルからエポックタイムスタンプを取得するPOSIX互換の方法は何ですか?

シェルからエポックタイムスタンプを取得するPOSIX互換の方法は何ですか?

私はPOSIXを見つけました。date%sまたは%N形式項目がないようです。だから私はそれらを使用することはできません。シェルスクリプトからエポックタイムスタンプを取得する別の方法は何ですか?

ベストアンサー1

整数秒のエポック時間の場合、これは次のようになります。

awk 'BEGIN{srand(); print srand()}'

または:

awk 'BEGIN{print srand(srand())}'

〜のようにPOSIXではawksrand()パラメータがない場合は、現在の時間を疑似乱数ジェネレータのシードとして使用します。また、以前のシードを返すため、srand()上記の2番目のシードは以前のシードで使用されたエポック時間を返します。

以下を使用して小数部を取得できます。

echo|LC_ALL=C TZ=UTC0 diff -u /dev/null - |sed -n '2s/.*\(\.[0-9]*\).*/\1/p'

POSIXは出力フォーマットを指定しますdiff -u、ファイルがある場合は現在時刻を使用してください-

ただし、出力を受信する前に呼び出されてから数千または数百万ナノ秒が経過した可能性があり、同じ秒ではない可能性がありawkます。ただし、次のもの<epochtime> % 60と比較して、これが真であることを確認できます。第二diff必要に応じて、ヘッダーで(UTC)タイムスタンプの一部にすることができます。


1このawkソリューションに関して、POSIXは過去にこれを表現するために多くの言語を使用していないことに注意してください。私がやった異議申し立てしばらく前に、POSIXの不明瞭な表現について尋ねられ、実装にそのような過酷なエントロピーソースを使用することを強制することは今日では不合理であると指摘しました。逆に、解決するsrand()エポック時間を使用するための明示的な要件です。

おすすめ記事