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 . p>
Voici quelques solutions que je l'ai déjà Exclue ... p>
date +% s code> // ne fonctionne pas sur Solaris p> Blockquote>
J'ai vu quelques scripts shell suggested avant, qui parser la sortie de
date code> puis secondes Derive de la date du calendrier grégorien au format, mais ils ne « t semblent prendre des détails comme secondes bissextiles. p>
GNU awk a le
strftime code>, mais ce n'est pas disponible en standard
awk code>. p>
Je pourrais écrire un petit programme C qui appelle le temps
code>, mais le binaire serait spécifique à une architecture particulière. p>
Est-il possible de la plate-forme croisée de le faire en utilisant seulement des outils conformes POSIX? p>
Je suis tenté d'abandonner et accepter une dépendance sur Perl, qui est au moins largement déployée. P>
perl -e 'print temps' // Tricher (non-POSIX), mais devrait fonctionner sur la plupart des plates-formes p> Blockquote>
3 Réponses :
Juste à des fins éducatives, un peu de hack. Mais c'est comme POSIX que vous pouvez imaginer: -) permet de voir ce que cela imprime: p>
pax -wx cpio x code> produit
pax: mauvaise option: -wx code> et ensuite info d'utilisation
PAX -WX CPIO X CODE> Produit deux lignes:
PAX: CPIO Header Field est trop petit pour stocker Fichier X CODE>
07070700000000000000000000000000000000000000000000000000000000000000000000000000000000TRAIA !!! CODE> . Il en va de même pour
PAX -W -X CPIO X CODE>. Version PAX: 1: 20171021-2 sur Ubuntu 18.04.
devrait être assez portable, mais nécessite un accès en écriture à Je n'ai pas utilisé fonctionne sur FreeBSD, de toute façon. P> {. CURDIR}; code> peut-être peut être modifié.
/ tmp code> pour L'exécutable depuis la plupart des gens ont
/ tmp code> monté noexeec. 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
Voici une solution POSIX / POSIX CODE> SOLUTION:
PATH=`getconf PATH` awk 'BEGIN{srand();print srand()}'
D'ACCORD; Je me suis trompé. Oui, j'ai supposé awk code> 's
srand () code> 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 CODE> doivent arriver.
Sur mon système (Ubuntu): le premier srand () code> 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 code> plutôt que
Imprimer code> évitera la nouvelle ligne de fin.