Leia a primeira linha da saída de um comando. Comando me conecta a um terminal remoto

1

Parte 1

Digamos que eu tenha um comando my_command que produz várias linhas.

Gostaria de capturar a primeira linha da saída de my_command assim que ela estiver pronta em um script, mantendo my_command em execução.

Eu pensei que algo assim funcionaria:

# 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

mas isso não acontece. A declaração echo só é atingida apenas uma vez my_command foi totalmente concluída, o que não é o que eu quero.

Parte 2

Entrando em mais detalhes: Imagine my_command é na verdade um comando que conecta meu shell a um shell remoto. Isso mudaria de alguma forma nossa solução para a Parte 1 ?

Caso os detalhes sejam importantes, my_command é, na verdade, um comando de uma linha:

bsub /bin/zsh .

Este é um comando Platform LSF que submete um trabalho a partir de uma máquina de login (um shell zsh interativo no nosso caso ) para uma rede remota. Depois que o trabalho enviado recebe um espaço aberto na grade, o LSF o despacha, fornecendo um shell interativo na máquina remota.

A primeira coisa que o bsub faz é produzir o job ID do meu trabalho na fila remota (isso é o que espero analisar no meu script) e, depois que um slot é aberto, ele despacha o meu trabalho. / p>

Gostaria de saber se uma solução trivial para a Parte 1 funcionaria para Parte 2

    
por Amelio Vazquez-Reina 25.10.2011 / 20:20

3 respostas

3

Você usa read para obter uma linha de entrada de cada vez. Você pode fazer algo assim:

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 25.10.2011 / 21:00
3

Por que você simplesmente não canaliza para a cabeça -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

Isso também permite que o my_command termine, mas só traz de volta a primeira linha, que pode então ser correspondida ao grep.

    
por 25.10.2011 / 21:44
1

Isso é para bash , zsh pode ser um pouco 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
    
por 25.10.2011 / 20:59

Tags