10
votes

Obtenez des secondes depuis l'époque dans n'importe quelle coquille compatible POSIX

Je voudrais savoir s'il y a un moyen d'obtenir le nombre de secondes écoulées depuis l'époque UNIX dans un shell compatible POSIX, sans avoir recours à des langues non POSIX comme perl, ou en utilisant des extensions non POSIX comme la fonction strftime de GNU awk .

Voici quelques solutions que je l'ai déjà Exclue ...

date +% s // ne fonctionne pas sur Solaris

J'ai vu quelques scripts shell suggested avant, qui parser la sortie de date puis secondes Derive de la date du calendrier grégorien au format, mais ils ne « t semblent prendre des détails comme secondes bissextiles.

GNU awk a le strftime , mais ce n'est pas disponible en standard awk .

Je pourrais écrire un petit programme C qui appelle le temps , mais le binaire serait spécifique à une architecture particulière.

Est-il possible de la plate-forme croisée de le faire en utilisant seulement des outils conformes POSIX?

Je suis tenté d'abandonner et accepter une dépendance sur Perl, qui est au moins largement déployée.

perl -e 'print temps' // Tricher (non-POSIX), mais devrait fonctionner sur la plupart des plates-formes


0 commentaires

3 Réponses :


2
votes

Juste à des fins éducatives, un peu de hack. Mais c'est comme POSIX que vous pouvez imaginer: -) xxx

permet de voir ce que cela imprime: xxx


2 commentaires

pax -wx cpio x produit pax: mauvaise option: -wx et ensuite info d'utilisation


PAX -WX CPIO X Produit deux lignes: PAX: CPIO Header Field est trop petit pour stocker Fichier X 07070700000000000000000000000000000000000000000000000000000000000000000000000000000000TRAIA !!! . Il en va de même pour PAX -W -X CPIO X . Version PAX: 1: 20171021-2 sur Ubuntu 18.04.



-4
votes

devrait être assez portable, mais nécessite un accès en écriture à {. CURDIR}; code> peut-être peut être modifié.

Je n'ai pas utilisé / tmp code> pour L'exécutable depuis la plupart des gens ont / tmp code> monté noexeec. p>

fonctionne sur FreeBSD, de toute façon. P>

#!/bin/sh

# Portably gets the date since epoch

bn=`basename $0`
prog=`mktemp /tmp/${bn}.mktime.XXXXXXX` || exit 1
>${prog}.c cat <<EOF
#include <stdio.h>
#include <time.h>
int main() {printf("%ju", time(NULL)); return 0; }
EOF

cc ${prog}.c
time=`./a.out`
rm ${prog} a.out

echo Time since epoch = $time seconds


0 commentaires

12
votes

Voici une solution POSIX / POSIX CODE> SOLUTION:

PATH=`getconf PATH` awk 'BEGIN{srand();print srand()}'


4 commentaires

D'ACCORD; Je me suis trompé. Oui, j'ai supposé awk 's srand () serait parallèle la version C. Ce n'est clairement pas. Weird, mais ce que vous décrivez, c'est ce que les documents POSIX pour AWK doivent arriver.


Sur mon système (Ubuntu): le premier srand () est nécessaire.


@ J.f.sebastian Merci, répondez à la mise à jour du comportement de l'État Gawk.


@jlliagre merci pour la grande réponse! Remarque: Utilisation de printf plutôt que Imprimer évitera la nouvelle ligne de fin.