--tailbox и --progressbox хорошо справляются с этим, за исключением того, что если вывод становится слишком большим, вы можете видеть только то, что соответствует размеру экрана.
Это не совсем правильно. --tailbox позволяет вам прокручивать влево и вправо. Но это не позволяет вам прокручивать вверх и вниз, что очень жаль.
Чтобы обойти это, вы можете предоставить --tailbox с --extra-button которая вызывает, например, --textbox . (Тогда кнопка «Выход» становится кнопкой «ОК», поэтому вы должны использовать --ok-label если хотите изменить заголовок.)
Закрытие --textbox может либо прерваться, либо вернуться в --tailbox . Далее он возвращается к --tailbox:
(
log=/tmp/make-kernel.log
# start process that writes to "$log" here
exit_status=1
while [ $exit_status -ne 0 ]
do
dialog \
--ok-label Close \
--extra-button --extra-label Inspect \
--tailbox "$log" 21 80
exit_status=$?
if [ $exit_status -eq 255 ]; then
dialog --textbox "$log" 21 80
fi
done
)
Редактировать: я нашел пример, который намеревается сделать это, но я, честно говоря, не понимаю, как это работает или как его перевести на пример find / -name "a*" . см. последний пример на http://mywiki.wooledge.org/BashFAQ/040
Большое спасибо за ссылку на этот пример. Наконец, я понимаю, как --tailboxbg должен работать.
Однако, в отличие от моего подхода, этот пример «как есть» не позволил бы вам прокручивать выходные данные (и при этом не претендует на это). Кроме того, здесь (диалог 1.3-20160828), кнопка не отображается в --tailbox , что для сравнения не является удобным для пользователя.
Как это работает, так:
# POSIX
# you cannot tail a nonexistent file, so always ensure it pre-exists!
> dialog-tail.log
«Создайте пустой файл dialog-tail.log чтобы в приведенном ниже dialog отображался файл, даже если в него еще ничего не записано».
{
for i in 1 2 3; do
printf '%d\n' "$i"
sleep 1
done
printf 'Done\n'
} > dialog-tail.log &
«Запишите числа от 1 до 3 в файл dialog-tail.log , каждое в отдельной строке (\n), одно число в секунду (sleep 1), и сделайте это в фоновом режиме (&)».
В вашем случае вы бы заменили { … } на find / -name 'a*' . Вы также можете перенаправить стандартный поток ошибок find .
dialog --title "TAIL BOXES" \
--begin 10 10 --tailboxbg dialog-tail.log 8 58 \
--and-widget \
--begin 3 10 --msgbox "Press OK " 5 30
«Отобразите файл в поле в строке 10, столбце 10, с заголовком« TAIL BOXES », как будто tail(1), но запустите это поле в фоновом режиме (--tailboxbg вместо --tailbox), чтобы получить дополнительный Виджет (--and-widget) может быть немедленно отображен, начиная со строки 3, столбца 10 (--begin 3 10 ; над хвостовой рамкой). Этот виджет представляет собой --msgbox с текстом «Нажмите OK», высотой 5 и шириной 30 дюймов ».
wait
«Не выполняйте следующие команды, пока не завершатся все дочерние процессы в фоновом режиме (здесь: процесс, который пишет в файл, и dialog)». (RTFM, соответственно)