Tengo un script que ejecuta comandos como:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"
El problema está probablemente en la tubería hacia tee
. No parece obtener toda la salida. Cuando la aplicación se cierra, faltan las últimas líneas de la salida (generalmente las que contienen un error fatal). Cuando ejecuto la aplicación sin canalización tee
, los obtengo en la salida.
¿Cómo puedo forzar que el script espere a que T complete el procesamiento de toda la salida?
Respuestas:
El error fatal probablemente salga en STDERR (2), no en STDOUT (1). Puede redirigir STDERR a STDOUT con
2>&1
y luego la tubería también debe capturarlo.Si tiene problemas de almacenamiento en la parte superior, podría forzarlo a un estado sin búfer:
fuente
Como los mensajes de error normalmente se muestran en STDERR (descriptor de archivo 2), debe redirigir tanto STDOUT como STDERR para
tee
:Cuando lo hace
./some_app -i $INDEX | tee $LOG
, solo está redirigiendo el STDOUT atee
.|&
hará que tanto STDOUT como STDERR sean redirigidos.Si no puede redirigir solo el STDOUT (como era):
Por otro lado, si desea redirigir solo el STDERR:
fuente