#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