Bash получить последнюю строку (в сочетании) из стандартного вывода - PullRequest
2 голосов
/ 12 апреля 2019

У меня есть скрипт, который выполняет множество различных операций и отображает статус их завершения в понятной форме для пользователя. Мне нужна функция, чтобы некоторые строки можно было извлечь как переменные для дальнейшей обработки. Это очень упрощенный пример:

#!/bin/bash

echo "Test script."
echo -n "1) cat file "
cat ./testfile.f &> /dev/null
if [ $? -eq 0 ]
then
    echo "$(tput hpa $(tput cols))$(tput cub 8)[OK]"
else
    echo "$(tput hpa $(tput cols))$(tput cub 8)[FAIL]"
fi
echo -n "2) make subfolder "
mkdir ./testdir &> /dev/null
if [ $? -eq 0 ]
then
    echo "$(tput hpa $(tput cols))$(tput cub 8)[OK]"
else
    echo "$(tput hpa $(tput cols))$(tput cub 8)[FAIL]"
fi

Это займет некоторое время:

$./test.sh
Test script.
1) cat file                               [FAIL]
2) make subfolder                         [OK]

Как я могу получить последнюю строку (в идеале, любую строку) во время выполнения скрипта? В идеале это будет использование функции (чтобы я мог работать с полученной строкой). Эта строка будет обрабатываться в том же сценарии. Пока что я вижу только одно решение: перенаправить вывод каждой команды echo с помощью tee.

Есть ли способ прочитать уже выведенные данные!?

1 Ответ

1 голос
/ 13 апреля 2019

Предположим, у вас есть строки {1..5}, которые нужно обработать:

process() {
   while read -r input; do
      sleep 2
      echo "Processed ${input}."
   done
}

printf "line %s\n" {1..5} | process

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

display() {
   while read -r input; do
      echo "=== ${input} ===" >&3
      echo "${input}"
   done
}

process() {
   while read -r input; do
      sleep 2
      echo "Processed ${input}."
   done
}

exec 3>&1
printf "line %s\n" {1..5} | display | process
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...