Bash: uso de ampersand para correr un programa en segundo plano, y efectos en variables (solucionado)

Imagen de J.D.
0 puntos

En primer lugar, decir que éste es mi primer mensaje en el foro, por lo que ahí va mi presentación y mi saludo para todos.

Paso ya al objeto del post:

Al usar el TVtime, me encuentro con que en ocasiones detecta la tarjeta capturadora y en otras no. Esto se debe a que, por defecto, TVtime arranca siempre sobre /dev/video0, y a veces, ahí se aloja la tarjeta de TV, pero a veces la webcam (al menos en mi caso).

Esto tiene fácil solución, pues basta con abrir una terminal y ejecutar tvtime -d /dev/video1, pero estoy intentando hacer un script para que sea el propio sistema el que abra el TVtime de forma correcta.

He pensado en ejecutar TVtime en modo verbose sobre /dev/video0, luego leer la salida y buscar si aparece alguna línea que indique que el dispositivo seleccionado no soporta pantalla completa (síntoma de que se trata de mi webcam y no de la capturadora de TV), y de ser así, cerrarlo y probar con /dev/video1.

El script que he hecho es como sigue:

#!/bin/bash

#creamos variable con resultado de tvtime en video0
RESPU=`tvtime -d /dev/video0 -v * 2>&1 | grep studio`
echo "----------RESPU=$RESPU"

#cerramos tvtime (estas líneas son innecesarias si lo cerramos manualmente)
IDPRO=`pgrep -u enemotrop tvtime`
echo "----------IDPRO=$IDPRO"
kill $IDPRO

#si el resultado de tvtime en video0 fue negativo, lo ejecutamos en video1
if [ "$RESPU" = " does not support full size studio-quality images required by tvtime." ]; then
echo "PASAMOS A VIDEO1"
tvtime -d /dev/video1
else
echo "SEGUIMOS EN VIDEO0"
tvtime -d /dev/video0
fi

El script funciona perfectamente, pero el problema es que tras ejecutar la primera línea (RESPU=`tvtime -d /dev/video0 -v * 2>&1 | grep studio`) se queda ahí y hay que cerrar el TVtime a mano; entonces sigue correctamente con el script y abre nuevamente el TVtime ya bien configurado.

Quiero hacer que haga todo el proceso de forma automática, pero si detrás de esa primera línea pongo un ampersand ("&"), entonces el script no asigna ningún valor a la variable RESPU, por lo que entiende que no hay error con /dev/video0 aunque realmente sí lo haya.

¿Cómo puedo hacer que el script funcione de una vez, cerrando él mismo el TVtime la primera vez, y guardando el valor correcto en la variable?

Muchas gracias

Imagen de slap
+1
0
-1

Probablemente hay más formas de hacerlo,pero a mí se me ocurre esta:

(Nota: no conozco tvtime por lo que los parámetros que pasas asumo que son correctos)

tvtime -d /dev/video0 -v * &> /tmp/result.txt &
# Le damos tiempo para que arranque
sleep 5
TVPID=`pidof tvtime`
# El kill, en vez de hacerlo siempre, hazlo cuando ya sepas si arrancó correctamente o no.
kill $TVPID

RESPU=`cat /tmp/result.txt`

(resto script)
rm /tmp/result.txt

Saludos.
slap

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de J.D.
+1
0
-1

Así ha quedado el código finalmente:

 

#!/bin/bash

#creamos variable con resultado de tvtime en video0
tvtime -d /dev/video0 -v 2> /tmp/tvtimelog.txt &
sleep 1
RESPU=`cat /tmp/tvtimelog.txt | grep studio`

#si el resultado de tvtime en video0 fue negativo, lo ejecutamos en video1
if [ "$RESPU" = "    does not support full size studio-quality images required by tvtime." ]; then
    echo "PASAMOS A VIDEO1"
    TVPID=`pidof tvtime`
    kill $TVPID
    sleep 1
    tvtime -d /dev/video1
else
    echo "SEGUIMOS EN VIDEO0"
fi
rm /tmp/tvtimelog.txt

 

Muchas gracias! 

+1
0
-1