Existen "especificaciones de Linux" pero no regulan el comportamiento del comando date
mucho. Lo que tiene es realmente lo opuesto: Linux (o más específicamente las herramientas de espacio de usuario de GNU) tiene una gran cantidad de extensiones que no son compatibles con Unix por cualquier definición razonable.
Hay una gran cantidad de estándares que hacen regulan estas cosas. El que usted debe mirar es POSIX cuales requiere
date [-u] [+format]
y nada más para estar soportado mediante la adhesión implementaciones. (Hay otros estándares como XPG y SUS que también debería considerar, pero al menos, debería requerir y esperar POSIX en estos días ... finalmente.)
El documento POSIX contiene una serie de ejemplos, pero no hay nada para la conversión de fecha que es, sin embargo, un problema práctico que muchas secuencias de comandos pasan a date
para. Además, para su problema concreto, no hay nada para reportar tiempos con precisión de segundo en POSIX.
De todos modos, pintar eso * BSD no es Linux no es realmente útil aquí; solo tienes que entender cuáles son las diferencias y codificar a la defensiva. Si sus requisitos son complejos o inusuales, tal vez recurra a un lenguaje de scripting como Perl o Python que realizan estos tipos de operaciones de formateo de fechas más o menos de fábrica en una instalación estándar (aunque ni Perl ni Python tienen una manera rápida y elegante de fecha conversión ya fuera, las soluciones tienden a ser un tanto torturadas).
En términos prácticos, puede comparar el MacOS date
man page y el Linux one y tratar de conciliar sus requisitos.
Para su necesidad práctica, MacOS date
no admite ninguna cadena de formato con precisión de nanosegundos, pero tampoco es probable que obtenga resultados útiles en esa escala cuando la ejecución del comando demorará un número significativo de nanosegundos. Me conformaría con la precisión del nivel de milisegundos (e incluso eso será descartado por el tiempo de ejecución en los dígitos finales) y multiplicar para obtener el número en escala de nanosegundos.
nanoseconds() {
python -c 'import time; print(int(time.time()*1000*1000*1000))'
}
(Note los paréntesis alrededor del argumento para print()
para Python 3.) Usted se dará cuenta de que Python hace reportar un valor con una precisión de nanosegundos (las últimas cifras no son a menudo ceros), aunque por el momento ha ejecutado time.time()
el valor obviamente ya no será correcto.
Para tener una idea de la tasa de error,
[email protected]$ python3
Python 3.5.1 (default, Dec 26 2015, 18:08:53)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> import timeit
>>> def nanoseconds():
... return int(time.time()*1000*1000*1000)
...
>>> timeit.timeit(nanoseconds, number=10000)
0.0066173350023746025
>>> timeit.timeit('int(time.time()*1000*1000*1000)', number=10000)
0.00557799199668807
La sobrecarga de partir Python e imprimir el valor es probablemente va a añadir unas órdenes de magnitud de los gastos generales, de manera realista, pero no he T intentó cuantificar eso. (La salida de timeit
está en segundos.)
La peor es sed ;-) – callumacrae
No confiaría en Linux con respecto al cumplimiento de algún estándar de Unix. Mac OS X sigue Single Unix Specification V3, no Linux. Además, una fecha con una precisión de nanosegundos obtenida de un comando bash es muy precisa, pero no tan precisa. ¿Cuál es tu necesidad? – mouviciel
Gracias por su entrada chicos. Aprenderé sobre GNU vs. BSD, y veré las diferencias entre sed. @mouviciel, quería crear un comando 'time' personalizado. –