2011-12-24 18 views
6

considerar la siguiente secuencia de comandos:fin a un script de shell sin esperar a las primeras partes de la tubería

#!/bin/bash 
function long_running { 
    for i in $(seq 1 10); do 
     echo foo 
     sleep 100 
    done 
} 

long_running | head -n 1 

Esto produce el resultado esperado (una línea "foo"), pero duerme (para los especificados 100 segundos) antes de terminar. Me gustaría que la secuencia de comandos finalice inmediatamente cuando lo haga la cabeza. ¿Cómo puedo forzar a bash a que salga de inmediato? Incluso cambiando la última línea a

long_running | (head -n 1; exit) 

o similar no funciona; No puedo obtener set -e, otra sugerencia común, para que funcione incluso si forzo una falla con, por ejemplo, (head -n 1; false) o similar.

(Esta es una versión simplificada de mi código real (obviamente) que no funciona, solo crea un conjunto bastante complejo de tuberías anidadas que buscan varias soluciones a un problema de restricción, ya que solo necesito una y no hago cuidado, que me hago, me gustaría ser capaz de hacer que el script termina mediante la adición de head -n 1 a la invocación ...)

+1

El ejemplo es un poco engañoso porque 'sleep 100' es un subproceso de su secuencia de comandos y ahora tiene forma de decirle su PID a otros procesos para que puedan matarlo. Sin embargo, usted escribió que este 'sleep 100' es en realidad un bloque de código, por lo que sugiero volver a escribir esta parte del ejemplo como FOR loop de' sleep 1'-s iterando 100 veces. – karatedog

+0

Bueno, si tengo un comando de ejecución larga (incluso una función de shell) en esa canalización, sigue siendo un subproceso. Pero tu ejemplo crea el mismo problema, sí. –

Respuesta

3

Cómo sobre el envío de la función a la cabeza como esto -

#!/bin/bash 
function long_running { 
    for i in $(seq 1 10); do 
     echo foo 
     sleep 100 
    done 
} 

head -n 1 <(long_running) 

Obviamente, si Aumentarás el -n a un número mayor, el sueño entraría pero saldría una vez que se completa la cabeza re.

+0

+1 para sustitución de proceso – SiegeX

+0

Esto parece funcionar muy bien, ¡gracias! Sería bueno si pudiera hacer que un oleoducto también funcionara, pero parece estar bien. –

+0

(Además, no estoy del todo claro por qué funciona, aunque sí ...) –

Cuestiones relacionadas