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

Проблема в том, что медлительность не кажется очень удобной для пользователя. Я не хочу, чтобы пользователь знал, как работает кэширование. Тем не менее, когда кеш грязный, им приходится ждать ~ 15 секунд, чтобы он был восстановлен. Я хочу добавить кое-что, указывающее, что мы загружаем эти данные.

Я пытался добавить простой echo "Querying <third party tool>...", но, что интересно, кажется, что результаты завершения не появляются до тех пор, пока я снова не нажму вкладку (предположительно, потому, что это только эхо, когда кеш грязный, и второй раз, когда я нажимаю вкладку, читает прямо из кэша). Вместо этого я попытался сделать это эхом для stderr, но тот же результат.

Я почти уверен, что видел, как другие инструменты отображают значки загрузки, когда загрузка вкладки завершена. Примечательно, что gcloud показывает это при завершении --project. Но я не нашел признаков того, как они это делают.

0
ctrl-alt-delor 22 Янв 2021 в 10:18
На самом деле, завершение не отображалось из-за ошибки пользователя. Теперь я могу вывести текст «Загрузка», но на самом деле он не исчезает. Это делает его не очень пригодным для использования.
 – 
Kat
22 Янв 2021 в 04:35

2 ответа

Вот небольшая анимация:

animation() {
  tput civis
  while true; do
    for i in {1..3}; do
      echo -ne "."
      sleep 1
    done
    for i in {1..3}; do
      echo -ne "\b \b"
      sleep 1
    done
  done
  tput civvis
}

kill_animation() {
  kill $anim
  echo
}

echo -n "Loading" && animation & anim=$!

sleep 10

kill_animation

Результат такой:

enter image description here

2
schrodigerscatcuriosity 22 Янв 2021 в 05:48

Поиграв немного, я нашел то, что работает. По сути, идея состоит в том, чтобы вернуть текст, который вы пишете, написать пробелы над ними, а затем вернуть их (экранирование \b только перемещает курсор, а не удаляет).

Я думаю, именно поэтому такие приложения, как gcloud, отображают один символ вместо текста. Я не хотел анимировать что-то в Bash и не видел хорошего единственного символа, который мог бы представлять загрузку, поэтому я сделал следующее:

# \e[2m = dim, \e[0m = reset
echo -ne "\e[2mLoading...\e[0m"

# do the slow thing...

# same number of `\b` and ` ` as "Loading..."
echo -ne "\b\b\b\b\b\b\b\b\b\b          \b\b\b\b\b\b\b\b\b\b"

Не нашел никаких проблем, кроме того, что это уродливый код.

0
Kat 22 Янв 2021 в 04:47
Чтобы исправить код: поместите каждую из этих волшебных строк в переменную с красивым именем, а затем используйте переменные.
 – 
ctrl-alt-delor
22 Янв 2021 в 10:21