Захват и сохранение значения из выходных данных сценария оболочки с одновременным отображением прогресса?

#bash #shell

#баш #оболочка

Вопрос:

Я использую сценарий bash из восходящего репозитория, который отражает прогресс высокого уровня по мере прохождения скрипта. В конце он отображает путь / имя файла для результатов выполнения скрипта. Я пытаюсь получить этот путь / имя файла без изменения скрипта, поскольку скрипт часто меняется. Я не могу понять, как получить путь / имя файла.

  • Если я передам вывод по grep каналу, то я потеряю текст вывода прогресса.
  • Если я использую awk с регулярным выражением для сопоставления, я также теряю текст вывода прогресса.
  • С помощью скрипта-оболочки назначение переменной для вывода команды subscription with sed завершается сбоем, и я не знаю, является ли это совпадением, заменой команды или неправильным инструментом для задания.

Я потратил много времени и подумал, что сейчас самое подходящее время спросить:

Как я должен это сделать?

Вот пример, просто чтобы продемонстрировать результат.

 #!/bin/bash

echo "The directory to be analyzed abc123/def456/"
echo "## CPU"
echo "## Messages"
echo "## Out of Memory"
echo "Calling other script..."
echo "Done."
echo
echo "## Please check out the file /tmp/report_user1/def456-2020-12-02.log"
 

Выход. Я пытаюсь получить путь / имя файла из последней строки.

 The directory to be analyzed abc123/def456/
## CPU
## Messages
## Out of Memory
Calling other script...
Done.

## Please check out the file /tmp/report_user1/def456-2020-12-02.log
 

Спасибо тебе.

Комментарии:

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

2. Вывод скрипта @Milag в стандартный вывод, как и сейчас. Я хочу скопировать файл .log в текущий каталог, а затем открыть его в моем текстовом редакторе.

3. Я могу опубликовать рабочий прототип; пока попробуйте это как сценарий-оболочку: var=$(main-script | tee /dev/tty | grep '.log$'); echo "var $var"

4. Отправлять обновления статуса в stderr, а окончательный вывод в стандартный вывод?

5. @Milag Это отлично работает. Большое спасибо! Вы хотите создать ответ, чтобы я мог его выбрать?

Ответ №1:

Для просмотра стандартного вывода на вашем терминале плюс захват / фильтр, одним из методов без файлов tmp является передача выходных данных из любой [утилиты или скрипта] в tee /dev/tty , а tee также передача выходных данных в фильтр, например:

 util | tee /dev/tty | grep '.log

преобразование приведенного выше в переменную bash:

 var=$(util | tee /dev/tty | grep '.log

Из описания OP вышеприведенное может быть написано по сценарию,  tee  вывод может быть уменьшен другими методами, файл журнала скопирован, затем выполнен  $EDITOR ./copy.log  


преобразование приведенного выше в переменную bash:


Из описания OP вышеприведенное может быть написано по сценарию, tee вывод может быть уменьшен другими методами, файл журнала скопирован, затем выполнен $EDITOR ./copy.log

)

Из описания OP вышеприведенное может быть написано по сценарию, tee вывод может быть уменьшен другими методами, файл журнала скопирован, затем выполнен $EDITOR ./copy.log

преобразование приведенного выше в переменную bash:


Из описания OP вышеприведенное может быть написано по сценарию, tee вывод может быть уменьшен другими методами, файл журнала скопирован, затем выполнен $EDITOR ./copy.log