(posiblemente relacionado con Do some programs not accept process substitution for input files?)Bash sustitución de procesos y sincronización
En algunos scripts de prueba de unidad Bash estoy usando el siguiente truco para conectarse y stdout y stderr pantalla de un comando:
command > >(tee "${stdoutF}") 2> >(tee "${stderrF}" >&2)
Este proceso produce algunos resultados en stdout, por lo que el archivo $stdoutF
obtiene algunos datos. Luego ejecutar otro comando que no hace ninguna salida de datos:
diff -r "$source" "$target" > >(tee "${stdoutF}") 2> >(tee "${stderrF}" >&2)
Sin embargo, no parece que este proceso siempre se realiza correctamente antes de la prueba de vacío se ejecuta (usando shunit-ng):
assertNull 'Unexpected output to stdout' "$(<"$stdoutF")"
En una prueba de 100 intentos, esto falló 25 veces.
¿Debería ser suficiente para llamar sync
antes de probar el archivo para el vacío:
sync
assertNull 'Unexpected output to stdout' "$(<"$stdoutF")"
... y/o debe trabajar al obligar a la secuencia de los comandos:
diff -r "$source" "$target" \
> >(tee "${stdoutF}"; assertNull 'Unexpected output to stdout' "$(<"$stdoutF")")
2> >(tee "${stderrF}" >&2)
. ¿y/o es posible tee
de alguna manera al assertNull
directamente en lugar de un archivo?
Actualización: sync
no es la respuesta - Consulte la respuesta de Gilles a continuación.
Actualización 2: Discusión realizada más allá de Save stdout, stderr and stdout+stderr synchronously. Gracias por las respuestas!
Gracias por esta respuesta impresionante, esto sólo me ha hecho una mejor administración! –