O comando date pode levar como argumento outro comando date em um arquivo?

O comando date pode levar como argumento outro comando date em um arquivo?

Estou lendo oManual do GNU coreutilse estou experimentando o  datecomando. Aqui está o que encontrei no texto:

  1. O datecomando tem uma opção:-f datefile

    • Analise cada linha emarquivo de datacomo acontece com -d e exibir a data e hora resultantes.
    • isso significa dateque é olhar para cada linha emarquivo de data e tratá-lo como uma string de data para uso para exibir uma data específica.
  2. Emcapítulo 29 (Formatos de entrada de data), afirma-se:

    A saída do datecomando nem sempre é aceitável como uma sequência de datas, não apenas por causa do problema de idioma, mas também porque não existe um significado padrão para itens de fuso horário como 'IST'.  Ao usar datepara gerar uma sequência de datas destinada a ser analisada posteriormente, especifique um formato de data que seja independente do idioma e que não use itens de fuso horário diferentes de 'UTC' e 'Z'. Aqui estão algumas maneiras de fazer isso:

    $ LC_ALL=C TZ=UTC0 date
    
    • esta afirmação (especialmente a parte em negrito) implica para mim que eu deveria ser capaz de colocar no arquivo de dataum  datecomando como o acima, e o  datecomando que emito no terminal devem ser capazes de analisar esse datecomando noarquivo de data e produza a data correspondente.

Não está funcionando para mim. Ou há algo errado com meu comando date no arquivo de datas (aspas erradas, alguma sintaxe especial que não conheço...), ou a -f datefileopção não é capaz de lidar com esta situação.

O que estou perguntando, em resumo, é:

  • o date -fcomando pode ser alimentado com um arquivo onde a string de data em uma linha é outro comando de data? por exemplo, posso colocar em um arquivo uma string "data" na primeira linha (que, como um comando, retornaria a hora do sistema) e, em seguida, alimentar esse arquivo em um  date -fcomando e obter a hora atual do sistema (gerada pelo  datecomando no arquivo)?

Responder1

O formato correto para data e hora que será analisado corretamente pela data GNU é:

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

E isso evita espaços também, que podem gerar outros problemas.

Se o seu arquivo contiver uma linha por data, como:

$ 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

Então isso funcionará:

$ 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


Se o que você deseja fazer é criar um arquivo com "comandos de data" como em:

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

Então você precisa executar cada linha com o shell.
Uma solução rápida é originar o arquivo e todos os comandos serão executados.

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

Isso responde sua pergunta?

Responder2

A datepartir do coreutils 8.21, TZ=UTC e LC_ALL=CI obtêm

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

como esperado. Verifiquei o código-fonte também: a mágica acontece na rotina batch_convertonde essencialmente há um loop over parse_datetime()/ show_date()assim como no caso da linha de comando (usando -d).

Responder3

Não, você não pode ler LC_ALL=C TZ=UTC0um arquivo com extensão date -f.

cat tz
LC_ALL=C TZ=UTC0

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

Você pode, entretanto, colocar o comando inteiro em um arquivo, assim:

cat date
#!/bin/bash

LC_ALL=C TZ=UTC0 date

Em seguida, execute-o na linha de comando, que fornece:

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

Ao contrário do fuso horário no meu servidor, que é:

date
tis 27 sep 2016 08:56:52 CEST

informação relacionada