Лучший способ создания табличного отображения CLI в Bash?

Лучший способ создания табличного отображения CLI в Bash?

Я работаю над скриптом Bash для массового тестирования флэш-памяти USB (использование f3под капотом). Мне нужно отобразить интерфейс в виде таблицы с несколькими столбцами и ячейками.

В настоящее время я использую printfи это выглядит так:

введите описание изображения здесь

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

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

Еще одна проблема, с которой я сталкиваюсь, — это время обновления и необходимость вручную очищать и перерисовывать весь экран из-за периодически появляющихся сообщений stderr grepили catиз-за того, что некоторые файлы не читаются должным образом.

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

Интересно, есть ли способ сохранить команды echoили printв текстовый файл, а затем выполнить их все одновременно, чтобы по сути получить текстовый «буфер», благодаря которому обновление может быть более последовательным и быстрым?

Я бы также хотел иметь возможность отслеживать нажатия клавиш пользователем и реагировать на них в фоновом режиме, но это не является приоритетом.

Может быть, в Bash есть лучший способ сделать это, о котором я не знаю?

решение1

Использование column -tдолжно вам подойти.

решение2

Вы можете использовать ее tputдля перемещения курсора, например, tput cup 0 0; echo testчтобы написать «тест» в верхнем левом углу экрана.

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

# In program setup
TEMPFILE=$(mktemp) # Create temporary file
trap "rm -f $TEMPFILE" EXIT # Remove temporary on exit

# Main lopp
while true
do
  echo "TEST" >$TEMPFILE # Clear file and set first line with >
  date >>$TEMPFILE # Append lines to file with >>

  clear # Clear the screen
  cat $TEMPFILE # Dump the file
  sleep 1 # Just for testing to avoid high CPU
done

Закомментируйте trapстроку, если вы хотите оставить временный файл для отладки.

решение3

Я думаю, что вы почти достигли того, что намеревались сделать, хотя и с несколькими незначительными ошибками и, возможно, некоторыми проблемами производительности. Лично я бы сначала попытался устранить ошибки, а затем попытался бы понять, где можно улучшить производительность. Однако, что касается частоты обновления, даже такие программы, как top или watch, обычно работают с обновлением каждые 2 или 1 секунду, и этого обычно достаточно. Вы не говорите, какой частоты вы пытаетесь достичь.

Есть похожийвопрос Stackexchange, который имеет два ответа/предложения,

  1. Использовать программу dialog, которой тоже нужно научиться.
  2. Демонстрирует создание функций bash для очистки, сброса и записи текста в определенной позиции на экране. Это аналогичный набор функций, которые вы, вероятно, использовали бы в ncurses, но имеющий преимущество использования echo (встроенной функции bash), поэтому он не несет накладных расходов /usr/bin/printfна форматирование вывода.

Рассматривайте свои проблемы по очереди.

  1. ошибки, выводимые фоновыми командами. Перенаправьте stderr либо в , /dev/nullесли вы просто хотите его отбросить, либо в файл для последующей обработки.

  2. Ошибка столбцов, покажите свой код, входные данные и требуемый вывод, затем мы сможем сделать предложения. Эта ошибка может быть следствием ошибки № 1, поэтому сначала решите № 1, а затем займитесь этой, если она все еще существует.

  3. Производительность (отредактируйте свой вопрос) и добавьте свой код, чтобы мы могли увидеть, что вы делаете, и внести предложения.

Другой способ — использовать другой интерпретатор скриптов, их так много, что выбирать нужно в зависимости от того, с какими из них вы знакомы. (awk, python, perl, другие оболочки, ...). Однако, если вы не собираетесь использовать ncurses, принцип будет похож на bashопределения функций, показанные в2-й ответвыше.

Связанный контент