Lea la primera línea de la salida de un command. El command me conecta a un terminal remoto

Parte 1

Digamos que tengo un command my_command que genera múltiples líneas.

Me gustaría capturar la primera línea de la my_command de my_command tan pronto como esté list en un script, mientras se mantiene mi my_command funcionamiento.

Pensé que algo así podría funcionar:

 # Get a code that `my_command` prints in its first line parsed_first_line=`my_command | grep -oEe '[0-9]+'` echo 'Here is the first line ' $parsed_first_line 

pero no es así La statement de eco solo se alcanza una vez que my_command ha terminado por completo, que no es lo que quiero.

Parte 2

Entrando en más detalles: Imagine my_command es en realidad un command que conecta mi shell a un shell remoto. ¿Esto cambiaría de alguna manera nuestra solución a la Parte 1 ?

En caso de que los detalles importen, my_command es realmente un command de una línea:

bsub /bin/zsh .

Este es un command Platform LSF que envía un trabajo de una máquina de inicio de session (un shell interactivo zsh en nuestro caso) a una networking remota. Una vez que el trabajo enviado obtiene un espacio abierto en la cuadrícula, LSF lo despacha, dándome un shell interactivo en la máquina remota.

Lo primero que hace bsub es generar el job ID de job ID de mi trabajo en la queue remota (esto es lo que espero analizar en mi script), y luego, una vez que se abre un espacio, despacha mi trabajo.

Me pregunto si una solución trivial para la Parte 1 funcionaría para la Parte 2

Usas read para get una línea de input a la vez. Puedes hacer algo como esto:

 my_command | { read line line=$(grep -oEe '[0-9]+'); if [ $line ]; then echo 'Here is the first line ' $line fi #possibly read more from my_command, transfer control to another program via `exec`, etc... } 

¿Por qué no solo pulas a la cabeza -1?

 # Get a code that `my_command` prints in its first line # parsed_first_line=`my_command | grep -oEe '[0-9]+'` parsed_first_line=$( my_command | head -1 | grep -oEe '[0-9]+' ) echo 'Here is the first line ' $parsed_first_line 

Esto también permite que my_command termine, pero solo devuelve la primera línea, que luego puede coincidir con tu grep.

Esto es para bash , zsh puede ser un poco diferente:

 #!/bin/bash # We'll need a temporary file. TMPFILE=`mktemp` # Start the process in the background my_command > $TMPFILE & # Get its pid so we can clean up that temp file later. PID=$! # Wait for the first line of output first_line=`head -n1 $TMPFILE | grep -oEe '[0-9]+'` while [ -z "$first_line" ]; do # Don't technically need this, but it'll prevent the system from grinding. sleep 1 first_line=`head -n1 $TMPFILE | grep -oEe '[0-9]+'` done echo Result: "$first_line" # Clean up that temp file. wait $PID rm $TMPFILE