
Estoy escribiendo un script bash que debería ejecutarse en OSX y Ubuntu. No estoy seguro de si este problema en particular se debe a una discrepancia en el sistema operativo; ¿Lo más probable es que sea una diferencia en el comando de fecha en los dos shells, aunque sea bash en ambos? Vamos a ver.
En el shell bash de OSX, para imprimir una fecha de hace dos días, hacemos esto:
date -v-2d +"%Y"."%m"."%d"
Sin embargo, esa -v
bandera no es válida en el shell bash de Ubuntu. En cambio, estamos usando:
date --date="2 days ago" +"%Y"."%m"."%d"
Desafortunadamente, la --date
bandera no se reconoce en nuestro shell bash de OSX.
Me encantaría tener un comando con indicadores que funcionen en ambos casos. ¿Alguien sabría qué podría probar?
Respuesta1
date
no es bash
incorporado. Es una utilidad del sistema y eso es algo en lo que OSX y Linux difieren. OSX usa herramientas BSD mientras que Linux usa herramientas GNU. Son similares pero no iguales.
Como has encontrado,en OSX, la -d
bandera para date
controlar el horario de verano, mientras que en Linux establece la hora de visualización. En OSX, -v
ajusta la fecha de visualización pero, en Linux, la -v
bandera es una opción no válida.
En su mayor parte, tanto BSD como GNU se esfuerzan por lograr la compatibilidad con el estándar POSIX. si lo compruebasel estándar POSIX paradate
, sin embargo, verás que no sirve de nada en este caso: no admite ninguna sintaxis para ajustar la fecha.
Si desea que su código funcione en ambas plataformas, intente:
[ "$(uname)" = Linux ] && date --date="2 days ago" +"%Y"."%m"."%d" || date -v-2d +"%Y"."%m"."%d"
O (requiere bash):
[ "$OSTYPE" = linux-gnu ] && date --date="2 days ago" +"%Y"."%m"."%d" || date -v-2d +"%Y"."%m"."%d"
Respuesta2
Conksh93(que en mi humilde opinión es mucho mejor queintentopara secuencias de comandos) puede utilizar el printf
incorporado, por ejemplo:
printf '%(%Y.%m.%d)T' '2 days ago'