date コマンドはファイル内の別の date コマンドを引数として受け取ることができますか?

date コマンドはファイル内の別の date コマンドを引数として受け取ることができますか?

私は読んでいますGNU coreutils マニュアル、私は dateコマンドを試しています。テキストで見つけた内容は次のとおりです。

  1. コマンドにはオプションdateがあります:-f datefile

    • 各行を解析する日付ファイルと同様に-d 、結果の日付と時刻を表示します。
    • つまり、date各行を見るということです日付ファイル それを日付文字列として扱い、特定の日付を表示するために使用します。
  2. 第29章(日付入力形式)、次のように述べられています。

    コマンドの出力はdate、言語の問題だけでなく、「IST」などのタイムゾーン項目に標準的な意味がないため、日付文字列として必ずしも受け入れられるとは限りません。  date後で解析することを目的とした日付文字列を生成するために使用する場合言語に依存せず、「UTC」と「Z」以外のタイムゾーン項目を使用しない日付形式を指定します。これを行うには、次の方法があります。

    $ LC_ALL=C TZ=UTC0 date
    
    • この文(特に太字部分)は、私が 日付ファイルdate上記のようなコマンドがあり、 ターミナル で発行したコマンドは、そのコマンドdateを解析できるはずです。date日付ファイル 対応する日付を出力します。

私の環境では機能しません。日付ファイル内の日付コマンドに問題があるか (引用符が間違っている、知らない特殊な構文など)、オプションが-f datefileこの状況を処理できないかのどちらかです。

要約すると、私が尋ねているのは次のことです。

  • date -f1 行の日付文字列が別の日付コマンドであるファイルをコマンドに渡すことはできますか? たとえば、ファイルの最初の行に文字列「date」(コマンドとしてシステム時刻を返します) を入れて、そのファイルをコマンドに渡して 、date -f現在のシステム時刻 ( dateファイル内のコマンドによって生成) を取得できますか?

答え1

GNU date によって正しく解析される日付と時刻の正しい形式は次のとおりです。

$ LC_ALL=C TZ=UTC0 date +"%Y-%m-%dT%H:%M:%S%z"
2016-09-28T04:08:55+0000

また、これにより、他の問題を引き起こす可能性のあるスペースも回避されます。

ファイルに次のように日付ごとに 1 行ずつ含まれている場合:

$ cat dates.txt
1992-03-28T14:26:01+0000
2004-02-29T21:02:02+0000
2005-02-28T21:02:03+0000
2015-07-02T11:52:04+0000
2016-03-31T01:36:05+0000

そうすると、次のようになります:

$ TZ=America/Los_Angeles date -f infile
Sat Mar 28 06:26:01 PST 1992
Sun Feb 29 13:02:02 PST 2004
Mon Feb 28 13:02:03 PST 2005
Thu Jul  2 04:52:04 PDT 2015
Wed Mar 30 18:36:05 PDT 2016


次のように「日付コマンド」を含むファイルを作成したい場合:

$ cat dates.txt
date -d "1992-03-28T14:26:01+0000"
date -d "2004-02-29T21:02:02+0000"
LC_ALL=C TZ=UTC0 date -d "2005-02-28T21:02:03+0000" +"%Y-%m-%d"
TZ=America/Los_Angeles date -d "2005-02-28T21:02:03+0000"
date -d "2015-07-02T11:52:04+0000"
date -d "2016-03-31T01:36:05+0000"

次に、シェルで各行を実行する必要があります。
1 つの迅速な解決策は、ファイルをソース化してすべてのコマンドを実行することです。

$ . ./dates.txt
Sat Mar 28 14:26:01 GMT 1992
Sun Feb 29 21:02:02 GMT 2004
2005-02-28
Mon Feb 28 13:02:03 PST 2005
Thu Jul  2 11:52:04 GMT 2015
Thu Mar 31 01:36:05 GMT 2016

これであなたの質問への回答になりましたか?

答え2

coreutils 8.21以降ではdate、TZ=UTCおよびLC_ALL=CIが取得されます。

$ date > x; sleep 1; date >> x; sleep 1; date >> x
$ date -f x
Wed Sep 28 03:32:39 UTC 2016
Wed Sep 28 03:32:40 UTC 2016
Wed Sep 28 03:32:41 UTC 2016
$

予想通りです。ソース コードも確認しました。コマンド ラインの場合 ( を使用) と同様に、基本的に/batch_convertをループするルーチンで魔法が起こります。parse_datetime()show_date()-d

答え3

LC_ALL=C TZ=UTC0いいえ、を含むファイルから読み取ることはできませんdate -f

cat tz
LC_ALL=C TZ=UTC0

date -f tz
date: invalid date ”LC_ALL=C TZ=UTC0”

ただし、次のようにコマンド全体をファイルに入れることもできます。

cat date
#!/bin/bash

LC_ALL=C TZ=UTC0 date

次に、コマンドラインから実行すると、次のようになります。

./date 
Tue Sep 27 06:56:29 UTC 2016

私のサーバーのタイムゾーンは次のとおりです。

date
tis 27 sep 2016 08:56:52 CEST

関連情報