El incorporado testy las [utilidades tienen las pruebas -nt("más nuevo que") y -ot("más antiguo que") en la mayoría de los shells, incluso cuando el shell se ejecuta en "modo POSIX" (también es cierto para las utilidades externas de los mismos nombres en el sistemas a los que tengo acceso). Estas pruebas son para comparar marcas de tiempo de modificación en dos archivos. Su semántica documentada varía ligeramente entre las implementaciones (con respecto a lo que sucede si uno u otro archivo existe o no), pero no están incluidos en la especificación POSIX. para la testutilidad .
No se
testtransfirieron a la utilidad cuando el comando condicional se eliminó del shell [KornShell] porque no se han incluido en latestutilidad integrada en implementaciones históricas de lashutilidad.
Suponiendo que me gustaría comparar la marca de tiempo de modificación entre archivos en un /bin/shscript de shell y luego tomar medidas dependiendo de si un archivo es más nuevo que el otro, como en
if [ "$sigfile" -nt "$timestamp" ] ||
[ "$sigfile.tmp" -nt "$timestamp" ]
then
return
fi
... ¿qué otra utilidad podría usar, aparte de make(lo que haría que el resto del script sea difícil de manejar por decir lo menos)? ¿O debería suponer que nadie ejecutará el script en una "implementación histórica de sh", o renunciar a escribir para un shell específico como bash?
fuente

-ntfunción de latestforma esperada ya que aprox. 1995. Debe usar lafindexpresión basd incluso conbashsi le gusta el comportamiento correcto.Respuestas:
POSIXLY:
El uso de la ruta absoluta a los archivos evita que un falso positivo con nombre de archivo contenga solo nuevas líneas.
En caso de utilizar la ruta relativa, cambie el
findcomando a:fuente
$f1solo contiene nuevas líneas;)-exec echo x \;o similar?-printfsería fácil si fuera estándarfindEl estado de salida de @Kusalananda AFAICT es independiente de las pruebas individuales defindretorno, excepto quizás si hay un error al ejecutar esas pruebas.findsale de 0 incluso si no se encuentran archivos.[ / -nt /nofile ]varía con la implementación (pero nunca genera ningún error).Esto podría ser un caso para el uso de uno de los comandos más antigua Unix,
ls.El resultado es verdadero si a es más nuevo que b.
fuente
-(falta--). Necesitarías-Lque sea equivalente a-nt. Eso no funciona para compararxy,$'x\nx'por ejemplo.Planteó una pregunta interesante e hizo un reclamo que primero debe verificarse.
Verifiqué el comportamiento de:
Con varias conchas. Aquí están los resultados:
bash no funciona: no imprime nada.
Bosh trabaja
el guión no funciona: no imprime nada.
ksh88 no funciona, no imprime nada.
ksh93 funciona
mksh no funciona, no imprime nada.
impresiones elegantes : elegante: [: -nt: operador / operando inesperado
yash funciona
zsh funciona en versiones más nuevas , las versiones anteriores no imprimen nada
Entonces, cuatro de nueve shells admiten la característica -nt y la implementan correctamente. Correctamente en este caso significa: es capaz de comparar marcas de tiempo en plataformas recientes que admiten granularidad de marcas de tiempo por debajo del segundo . Tenga en cuenta que los archivos que seleccioné difieren típicamente solo unos pocos microsegundos en sus marcas de tiempo.
Como es más fácil encontrar una
findimplementación que funcione , recomiendo reemplazarpor una
findexpresión basada.funciona al menos mientras
$file1no solo contenga nuevas líneas.es un poco más lento pero funciona correctamente.
Por cierto: con respecto a make, no puedo hablar de todas las implementaciones de make, pero
SunPro Makeadmite la comparación de tiempo con la granularidad de nanosegundos desde aprox. 20 años, mientras quesmakeygmakeagregó esta característica recientemente.fuente
findimplementaciones como busybox o heirloom-toolchest tendrán la misma limitación.-Llafindversión sea equivalente a-nt. También fallaría en los nombres de archivo que comienzan con-o!,(...findtienenfind -f "$file"para eso, pero no es portátil.