Я работаю над скриптом 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, который имеет два ответа/предложения,
- Использовать программу
dialog
, которой тоже нужно научиться. - Демонстрирует создание функций bash для очистки, сброса и записи текста в определенной позиции на экране. Это аналогичный набор функций, которые вы, вероятно, использовали бы в
ncurses
, но имеющий преимущество использования echo (встроенной функции bash), поэтому он не несет накладных расходов/usr/bin/printf
на форматирование вывода.
Рассматривайте свои проблемы по очереди.
ошибки, выводимые фоновыми командами. Перенаправьте stderr либо в ,
/dev/null
если вы просто хотите его отбросить, либо в файл для последующей обработки.Ошибка столбцов, покажите свой код, входные данные и требуемый вывод, затем мы сможем сделать предложения. Эта ошибка может быть следствием ошибки № 1, поэтому сначала решите № 1, а затем займитесь этой, если она все еще существует.
Производительность (отредактируйте свой вопрос) и добавьте свой код, чтобы мы могли увидеть, что вы делаете, и внести предложения.
Другой способ — использовать другой интерпретатор скриптов, их так много, что выбирать нужно в зависимости от того, с какими из них вы знакомы. (awk, python, perl, другие оболочки, ...). Однако, если вы не собираетесь использовать ncurses, принцип будет похож на bash
определения функций, показанные в2-й ответвыше.