Считайте первую строку вывода команды. Команда подключает меня к удаленному терминалу

Часть 1

Скажите, что у меня есть команда my_command это производит несколько строк.

Я хотел бы получить первую строку my_commandвывод, как только это готово в сценарии при хранении my_command выполнение.

Я думал, что что-то вроде этого будет работать:

# 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

но это не делает. Оператор эха только достигнут только однажды my_command полностью закончился, который не является тем, что я хочу.

Часть 2

Вхождение в большее количество деталей: Вообразить my_command на самом деле команда, которая подключает мою оболочку к удаленной оболочке. Это изменило бы всегда наше решение Части 1?

В случае, если детали имеют значение, my_command на самом деле короткая команда:

bsub /bin/zsh.

Это - a Platform LSF команда, которая отправляет задание от машины входа в систему (интерактивная оболочка zsh в нашем случае) к удаленной сетке. После того как отправленное задание получает открытый слот на сетке, LSF диспетчеризирует его, давая мне интерактивную оболочку на удаленной машине.

Первая вещь bsub делает производится job ID из моего задания на удаленной очереди (это - то, что я надеюсь проанализировать в своем сценарии), и затем после того как слот открыт, это диспетчеризирует мое задание.

Я задаюсь вопросом, работало ли тривиальное решение Части 1 на Часть 2

1
25.10.2011, 23:50
3 ответа

Вы используете read получить одну строку входа за один раз. Можно сделать что-то вроде этого:

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...
 }
3
27.01.2020, 23:13

Почему Вы просто не передаете по каналу для заголовка-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

Это также позволяет my_command закончиться, но он только возвращает первую строку, которой он может затем соответствовать против Вашего grep.

3
27.01.2020, 23:13

Это для bash, zsh может несколько отличаться:

#!/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
1
27.01.2020, 23:13

Теги

Похожие вопросы