Esistono "specifiche Linux" ma non regolano molto il comportamento del comando date
. Quello che hai è esattamente l'opposto: Linux (o più specificamente gli strumenti GNU user-space) ha un gran numero di estensioni che non sono compatibili con Unix con qualsiasi definizione ragionevole.
C'è un gran numero di standard che do regolano queste cose. Quello che dovrebbe essere guardando è POSIX che richiede
date [-u] [+format]
e niente di più da sostenere aderendo implementazioni. (Ci sono altri standard come XPG e SUS che potreste voler considerare, ma per lo meno, dovreste richiedere e aspettarvi POSIX in questi giorni ... finalmente.)
Il documento POSIX contiene un numero di esempi ma non c'è nulla per la conversione che è comunque un problema pratico che molti script si rivolgono a date
per. Inoltre, per il tuo problema concreto, non c'è nulla per riportare i tempi con accuratezza inferiore al secondo in POSIX.
In ogni caso, il fatto che * BSD non sia Linux non è molto utile qui; devi solo capire quali sono le differenze e codificare in modo difensivo. Se le tue esigenze sono complesse o insolite, potresti rivolgerti a un linguaggio di scripting come Perl o Python che eseguono questi tipi di operazioni di formattazione della data più o meno fuori dalla scatola in un'installazione standard (sebbene né Perl né Python abbiano un modo rapido ed elegante per fare la conversione fuori dalla scatola, entrambe le soluzioni tendono ad essere un po 'torturate).
In termini pratici, è possibile confrontare lo MacOS date
man page e lo Linux one e provare a riconciliare i requisiti.
Per le vostre esigenze pratiche, MacOS date
non supporta alcuna stringa di formato con accuratezza al nanosecondo, ma non è possibile ricevere risultati utili su tale scala quando l'esecuzione del comando richiederà un numero significativo di nanosecondi. Mi accontenterei di un'accuratezza di un millisecondo (e anche di quella che verrà scartata dal tempo di esecuzione nelle cifre finali) e moltiplicherò per ottenere il numero in scala di nanosecondi.
nanoseconds() {
python -c 'import time; print(int(time.time()*1000*1000*1000))'
}
(Notare le parentesi che racchiudono l'argomento per print()
per Python 3.) Si noterà che Python fa segnalare un valore a precisione nanosecondo (le ultime cifre spesso non sono zeri), anche se per il momento si aver eseguito time.time()
il valore ovviamente non sarà più corretto.
Per avere un'idea del tasso di errore,
[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
Il sovraccarico di partire Python e la stampa il valore è destinata probabilmente ad aggiungere un paio di ordini di grandezza di spese generali, realisticamente, ma mi rifugio' t ho tentato di quantificarlo. (L'output da timeit
è in secondi.)
Il peggiore è sed ;-) – callumacrae
Non mi fiderei di Linux per quanto riguarda la conformità ad alcuni standard Unix. Mac OS X segue Single Unix Specification V3, non Linux. Inoltre una data con una precisione di nanosecondi ottenuta da un comando bash è molto precisa ma non molto accurata. Qual è il tuo bisogno? – mouviciel
Grazie per il vostro contributo ragazzi. Imparerò a conoscere GNU vs. BSD e verificherò le differenze tra sed. @mouviciel, volevo creare un comando personalizzato 'time'. –