日期命令可以将文件中的另一个日期命令作为参数吗?

日期命令可以将文件中的另一个日期命令作为参数吗?

我正在阅读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 -f命令是否可以输入一个文件,其中一行上的日期字符串是另一个日期命令?例如,我可以在文件的第一行添加一个字符串“date”(作为命令,将返回系统时间),然后将该文件输入到命令中 date -f并获取当前系统时间(由 date命令生成)在文件中)?

答案1

GNU 日期正确解析的日期时间的正确格式是:

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

这也避免了可能产生其他问题的空间。

如果您的文件每个日期包含一行,例如:

$ 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"

然后您需要使用 shell 执行每一行。
一种快速解决方案是获取文件并执行所有命令。

$ . ./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

datecoreutils 8.21 开始,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

相关内容