¿Puede el comando de fecha tomar como argumento otro comando de fecha en un archivo?

¿Puede el comando de fecha tomar como argumento otro comando de fecha en un archivo?

Estoy leyendo elmanual de coreutils de gnu, y estoy experimentando con el  datecomando. Esto es lo que encontré en el texto:

  1. El datecomando tiene una opción:-f datefile

    • Analiza cada línea enarchivo de fechacomo con -d y muestra la fecha y hora resultantes.
    • eso significa datemirar cada línea enarchivo de fecha y tratarlo como una cadena de fecha para usar para mostrar una fecha en particular.
  2. EnCapítulo 29 (Formatos de entrada de fecha), se afirma:

    La salida del datecomando no siempre es aceptable como cadena de fecha, no sólo por el problema del idioma, sino también porque no existe un significado estándar para elementos de zona horaria como 'IST'.  Cuando se utiliza datepara generar una cadena de fecha destinada a ser analizada más tarde, especifique un formato de fecha que sea independiente del idioma y que no utilice elementos de zona horaria distintos de 'UTC' y 'Z'. A continuación se muestran algunas formas de hacer esto:

    $ LC_ALL=C TZ=UTC0 date
    
    • Esta afirmación (especialmente la parte en negrita) implica para mí que debería poder poner en archivo de fechaun  datecomando como el anterior, y el  datecomando que emito en la terminal debería poder analizar ese datecomando en elarchivo de fecha y generar la fecha correspondiente.

No está funcionando para mí. O hay algún problema con mi comando de fecha en el archivo de fecha (comillas incorrectas, alguna sintaxis especial que no conozco...), o la -f datefileopción no es capaz de manejar esta situación.

Lo que pregunto, en resumen, es:

  • date -f¿Se puede alimentar el comando con un archivo donde la cadena de fecha en una línea sea otro comando de fecha? por ejemplo, ¿puedo poner en un archivo una cadena "fecha" en la primera línea (que, como comando, devolvería la hora del sistema), y luego introducir ese archivo en un  date -fcomando y obtener la hora actual del sistema (generada por el  datecomando en el archivo)?

Respuesta1

El formato correcto para una fecha y hora que la fecha GNU analizará correctamente es:

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

Y eso evita espacios también, que pueden generar otros problemas.

Si su archivo contiene una línea por fecha 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

Entonces esto 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


Si lo que quieres hacer es crear un archivo con "comandos de fecha" como en:

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

Luego necesitas ejecutar cada línea con el shell.
Una solución rápida es obtener el archivo y se ejecutarán todos los comandos.

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

¿Esto responde a tu pregunta?

Respuesta2

Con datecoreutils 8.21, TZ=UTC y LC_ALL=CI obtienen

$ 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 se esperaba. También revisé el código fuente: la magia ocurre en la rutina batch_convertdonde esencialmente hay un bucle sobre parse_datetime()/ show_date()tal como en el caso de la línea de comando (usando -d).

Respuesta3

No, no puedes leer LC_ALL=C TZ=UTC0un archivo con date -f.

cat tz
LC_ALL=C TZ=UTC0

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

Sin embargo, puedes poner el comando completo en un archivo, como este:

cat date
#!/bin/bash

LC_ALL=C TZ=UTC0 date

Luego ejecútelo desde la línea de comando, que le dará:

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

A diferencia de la zona horaria de mi servidor, que es:

date
tis 27 sep 2016 08:56:52 CEST

información relacionada