El dateprograma en OS X es diferente al dateprograma coreutils de GNU . Puede instalar coreutils (incluida gnu-date), luego tendrá una versión dateque admita milisegundos.
Como la instalación desde el origen puede ser una molestia para los usuarios nativos de OS X, le aconsejo que use Homebrew .
Para instalar estas herramientas usando Homebrew, ejecute este oneliner en su terminal:
Homebrew ya está instalado (es aconsejable seguir las sugerencias del instalador después de la instalación). Ahora instalaremos coreutils usando brew.
brew install coreutils
Como dice la instalación, todos los comandos se han instalado con el prefijo 'g' (por ejemplo, gdate, gcat, gln, etc., etc.). Si realmente necesita usar estos comandos con sus nombres normales, puede agregar un directorio "gnubin" a su PATH ( ~/.bash_profile) como:
Agradable. Ni siquiera tuve que agregar la ruta, gdateestaba instalado en /usr/local/bin/gdate.
Adam Matan
Eso es lo que esperarías. Todos los binarios se instalan con el prefijo g. En la ruta, proporcioné los mismos gnu-coreutils sin el prefijo g. Entonces, si lo agrega en su ruta como PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH", reemplazará a los originales. Entonces OS X se dateconvierte en GNU date(en lugar de gdate)
CousinCocaine
Bien que funcionó.
CousinCocaine
3
Técnicamente, el +%s.%Nformato da los segundos a una precisión de nanosegundos, no milisegundos. Después de usar brew para instalar gdate, revisé la página de manual para ver si milisegundos estaba disponible. No es. Tampoco decía que se %Npudiera especificar una precisión para , pero lo intenté de todos modos. Descubrí que el comando para reducir los segundos a una precisión de milisegundos solamente (es decir, tres decimales) es gdate +%s.%3N.
LS
10
En OS X, simplemente ejecute date +%sya que OS X no admite más precisión que esta en datela salida y cualquier exceso de precisión no admitido por la representación interna se trunca hacia menos infinito.
Si desea una salida de milisegundos, puede usar el siguiente comando, aunque la salida solo se corrige agregando ceros en lugar de agregar precisión debido a la razón antes mencionada. Lo siguiente genera milisegundos correctos en sistemas que admiten la precisión necesaria.
OS X no es compatible %-N, por lo que no hace nada (y podría causar problemas si se establece la variable de shell $N). Solo usa date +%s000(o date +%s.000si quieres el punto decimal).
Gordon Davisson
@ Gordon Sí, mencioné esto, pero si OP está buscando una solución portátil que funcione con éxito en sistemas que sean capaces de esa precisión, el comando anterior funciona. Por supuesto, podría simplemente agregar ceros a la salida, pero copiarlo a otros sistemas que admitan la precisión adicional no sería lo ideal.
grg
Ah, ya veo. Pero dado que el datecomando de OS X simplemente pasa %-Ncomo N, puede interferir con el cálculo. Intente configurar N=7000000000000000000, luego intente el comando ... Este es un caso poco probable en la práctica, pero me sentiría más seguro con algo que no dependiera del entorno.
Gordon Davisson
@Gordon De hecho, establecer la variable la rompería. Supongo que la variable específica podría restablecerse justo antes de ejecutar el comando, pero restablecer variables como esa es algo que todo buen script debería hacer antes de ejecutar comandos de todos modos, por si acaso. Por supuesto, todo esto se basa en mi suposición de que el OP quiere una respuesta editada por script para incluir la adición literal de ceros.
grg
2
El OP solicitó "tiempo desde la época, en milisegundos", esta es una respuesta sobre cómo agregar ceros a una cadena. No es el mísmo. Aunque se explica en la publicación, no es una respuesta a la pregunta.
CousinCocaine
6
Esta solución funciona en macOS.
Si considera usar un script bash y tiene Python disponible, puede usar este código:
gdate
estaba instalado en/usr/local/bin/gdate
.date
convierte en GNUdate
(en lugar de gdate)+%s.%N
formato da los segundos a una precisión de nanosegundos, no milisegundos. Después de usar brew para instalargdate
, revisé la página de manual para ver si milisegundos estaba disponible. No es. Tampoco decía que se%N
pudiera especificar una precisión para , pero lo intenté de todos modos. Descubrí que el comando para reducir los segundos a una precisión de milisegundos solamente (es decir, tres decimales) esgdate +%s.%3N
.En OS X, simplemente ejecute
date +%s
ya que OS X no admite más precisión que esta endate
la salida y cualquier exceso de precisión no admitido por la representación interna se trunca hacia menos infinito.Si desea una salida de milisegundos, puede usar el siguiente comando, aunque la salida solo se corrige agregando ceros en lugar de agregar precisión debido a la razón antes mencionada. Lo siguiente genera milisegundos correctos en sistemas que admiten la precisión necesaria.
Fuente del comando anterior: Unix.SE - Cómo obtener milisegundos desde la época de Unix
Si solo desea un comando que agregue la cantidad correcta de ceros en OS X, puede usar:
fuente
%-N
, por lo que no hace nada (y podría causar problemas si se establece la variable de shell$N
). Solo usadate +%s000
(odate +%s.000
si quieres el punto decimal).date
comando de OS X simplemente pasa%-N
comoN
, puede interferir con el cálculo. Intente configurarN=7000000000000000000
, luego intente el comando ... Este es un caso poco probable en la práctica, pero me sentiría más seguro con algo que no dependiera del entorno.Esta solución funciona en macOS.
Si considera usar un script bash y tiene Python disponible, puede usar este código:
O escriba un
python
guión directamente:fuente
Perl es omnipresente.
fuente