日付コマンドは、ファイル内の他の日付コマンドを引数として使用できますか?

日付コマンドは、ファイル内の他の日付コマンドを引数として使用できますか?

私が読んでいるGNU coreutils マニュアル、このコマンドを試しています  date。私が記事で見つけたものは次のとおりです。

  1. このdateコマンドには1つのオプションがあります。-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"

その後、シェルを使用して各行を実行する必要があります。
簡単な解決策は、ファイルをインポートしてすべてのコマンドを実行することです。

$ . ./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からdateTZ = 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
$

予想通り。また、ソースコードも確認しました。ルーチンで魔法が発生します。デフォルトでは、コマンドラインケース(使用)と同様に/ loopbatch_convertがあります。parse_datetime()show_date()-d

答え3

いいえ、LC_ALL=C TZ=UTC0date -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

関連情報