Отображать вывод команды в терминале при использовании подстановки команд

Итак, я пытаюсь проверить вывод команды, но я также хочу иметь возможность отображать вывод непосредственно в терминале.

#!/bin/bash
while :
do
OUT=$(streamlink -o "$NAME" "$STREAM" best)
echo "$OUT"
if [[ $OUT == *"No playable streams"* ]]; then
  echo "Delaying!"
  sleep 15s
fi
done

Это то, что я пытался сделать.

Код проверяет, содержит ли вывод команды эту подстроку ошибки, и если да, то добавляется задержка. В этой части работает хорошо.

Но это не работает хорошо, когда команда фактически успешно загружает файл, поскольку она не будет выполнять это эхо, пока не завершит загрузку (что займет несколько часов). Так что до тех пор у меня нет возможности лично проверить вывод команды

Кроме того, вывод этой конкретной команды отображает и обновляет скорость и размер файла в режиме реального времени, что эхо не сможет воспроизвести.

Итак, есть ли способ отображать вывод команды в режиме реального времени, а также заменять их командой, чтобы проверять вывод на наличие подстрок после завершения команды?


person doko    schedule 30.05.2019    source источник


Ответы (1)


Используйте временный файл:

TEMP=$(mktemp) || exit 1

while true
do
    streamlink -o "$NAME" "$STREAM" best |& tee "$TEMP"
    OUT=$( cat "$TEMP" )
    #echo "$OUT" # not longer needed
    if [[ $OUT == *"No playable streams"* ]]; then
        echo "Delaying!"
        sleep 15s
    fi
done

# not really needed here because of endless loop
rm -f "$TEMP"
person Wiimm    schedule 30.05.2019
comment
Вывод говорит [cli][info]: command not found для строки $OUT=$( cat "$TEMP" ) Вы знаете, почему? - person doko; 30.05.2019
comment
Хорошо, я делаю несколько быстрых экспериментов. TEMP=$(mktemp); streamlink "$STREAM" |& tee "$TEMP"; cat "$TEMP" ошибок не выводит, а TEMP=$(mktemp); streamlink "$STREAM" |& tee "$TEMP"; $OUT=$( cat "$TEMP" ); echo $OUT выводит =: команда не найдена в конце - person doko; 30.05.2019
comment
Черт возьми, я идиот, я понял, это должно быть OUT=$( cat $TEMP ) без $ - person doko; 30.05.2019
comment
Хорошо, еще одна проблема: похоже, что команда не может отображать прогресс в реальном времени (скорость загрузки, размер файла и т. д.). Есть ли способ исправить это? - person doko; 30.05.2019
comment
Некоторые инструменты, такие как grep, используют буферизацию блоков вместо буферизации строк для вывода, если стандартный вывод не подключен к терминалу. grep --line-buffered исправить. Я не знаю, делает ли streamlink то же самое и имеет ли он такую ​​возможность. - person Wiimm; 30.05.2019
comment
У Streamlink, похоже, нет такой опции - person doko; 30.05.2019
comment
Дополнение: Вы можете доказать поведение (блочная или строковая буферизация) с помощью: COMMAND |& cat - или здесь с streamlink -o "$NAME" "$STREAM" best |& cat - - person Wiimm; 30.05.2019
comment
Вот еще один способ разбуферизации... stackoverflow.com/a/7162169/620097. Пожалуйста, исправьте опечатку в ответе! ... Тогда я проголосую ;-) . Всем удачи. - person shellter; 30.05.2019