GNU日付エポック+%s対タイムスタンプ構文(月を含む)の現在の計算?

GNU日付エポック+%s対タイムスタンプ構文(月を含む)の現在の計算?

シェルスクリプトでは、タイムスタンプフレーズでgnu日付を使用して日付計算を実行しようとしていますが、違いを説明できません。誰かが私を実現できますか?これはバグですか?

% date -u -d "now"
Fri Aug  2 15:07:16 UTC 2013

% date -u -d "1970-01-01 00:00:00 UTC  + `date +%s` seconds"
Fri Aug  2 15:07:29 UTC 2013

% date -u -d "now -6 months -1 day"
Fri Feb  1 15:07:52 UTC 2013

% date -u -d "1970-01-01 00:00:00 UTC  + `date +%s` seconds -6 months -1 day"
Tue Jan 29 15:08:03 UTC 2013

%sはマンページに「1970-01-01 00:00:00 UTC以降の秒数」として定義されているので、最後のエントリは前のエントリとまったく同じ意味であると予想しました。

答え1

作業順序が間違っているようです。このコマンドを実行すると正常に動作します。

$ date -u -d "$(date -u -d "1970-01-01 00:00:00 UTC  + `date +%s` seconds") \
     -6 months -1 day"

これを実行すると、奇妙な結果が表示されます。

$ date -u -d "$(date +%s) seconds -6 months -1 day"
Sun Sep  3 07:48:54 UTC 2056

しかし、$(date +%s) seconds括弧で保護すると問題が解決するようです。

$ date -u -d "($(date +%s) seconds) -6 months -1 day"
Fri Feb  1 15:55:12 UTC 2013

関連情報