Может ли команда 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команду вфайл_даты и вывести соответствующую дату.

У меня это не работает. Либо что-то не так с моей командой date в datefile (неправильные кавычки, какой-то особый синтаксис, о котором я не знаю...), либо опция -f datefileне способна обработать эту ситуацию.

Вкратце, я спрашиваю следующее:

  • можно ли date -fпередать команде файл, в котором строка даты на одной строке представляет собой другую команду даты? Например, можно ли поместить в файл строку «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

И это также позволяет избежать пробелов, которые могут создавать другие проблемы.

Если ваш файл содержит по одной строке на дату, например:

$ 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

С 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

Связанный контент