Вопрос или проблема
Эта функция отправляет API-запросы.
api_req() {
# запрос 1
echo 33
# запрос 2
echo 66
# запрос 3
echo 100
}
Это вернет 1, если любой из запросов потерпит неудачу.
Теперь я хочу передать это в диалог gauge.
Вот так,
if ! api_req | dialog --gauge "Отправка запросов" -1 -1 0; then
echo "API-запросы потерпели неудачу!!"
fi
Но он не может обнаружить сбой.
Я также пробовал api_req > >(dialog ...)
, но в этом случае диалог не отображается.
Как мне это заставить работать?
tmpfile=$(mktemp)
if api_req > "$tmpfile"
then
dialog --gauge "Отправка запросов" -1 -1 0 < "$tmpfile"
else
echo "API-запросы потерпели неудачу!!"
fi
Ответ или решение
Показ диалогового индикатора с сохранением кода выхода функции
В данной задаче необходимо реализовать функциональность, в которой будет отображаться диалоговый индикатор при выполнении API-запросов, при этом требуется сохранить корректный код выхода функции. Рассмотрим решение этой задачи более детально.
1. Описание функции api_req
Функция api_req
выполняет несколько запросов и возвращает результат выполнения. Ваша версия функции выглядит следующим образом:
api_req() {
# req 1
echo 33
# req 2
echo 66
# req 3
echo 100
}
Предполагается, что эта функция вернет код выхода 1, если любой из запросов завершился неудачно, что вы уже упомянули.
2. Использование диалогового индикатора
Для интеграции с dialog
, используется следующая конструкция:
if ! api_req | dialog --gauge "Sending requests" -1 -1 0; then
echo "api requests failed!!"
fi
Однако, в данной конструкции не удается отобразить возможность обработки кода выхода, что приводит к неэффективному отображению статуса выполнения.
3. Решение с использованием временного файла
Чтобы решить проблему, можно использовать временный файл, который позволит отобразить индикатор и сохранить код выхода функции. Пример реализации данного подхода:
tmpfile=$(mktemp)
if api_req > "$tmpfile"; then
dialog --gauge "Отправка запросов" -1 -1 0 < "$tmpfile"
else
echo "API запросы завершились неудачей!!"
fi
Объяснение подхода
-
Создание временного файла:
tmpfile=$(mktemp)
создает временный файл, в который будут записываться результаты выполнения функцииapi_req
. -
Запись результата:
if api_req > "$tmpfile"
выполняет функцию и записывает ее вывод в временный файл. Если выполнение функции успешно (код выхода 0), управление передается в блокthen
. -
Отображение индикатора:
dialog --gauge "Отправка запросов" -1 -1 0 < "$tmpfile"
инициирует диалоговый индикатор, отображая данные из временного файла. -
Обработка ошибок: Если функция завершилась с ошибкой, выполнится блок
else
, и на экран будет выведено сообщение о неудаче.
Заключение
Используя временный файл для сохранения результатов работы функции и отдельную проверку кода выхода, можно эффективно комбинировать вывод диалогового индикатора с обработкой ошибок. Этот подход позволяет сохранить все инструкции и индикацию выполнения в одном коде, обеспечивая интеллектуальную обработку результатов API-запросов.