3

Я хочу выполнить произвольную команду, например, find / -name "a*" я хочу направить свой вывод в диалог. --tailbox и --progressbox хорошо справляются с этим, за исключением того, что если вывод становится слишком большим, вы можете видеть только то, что соответствует размеру экрана.

Мне нужно иметь возможность использовать стрелки вверх / вниз и / или клавиши pg up / pg dn для прокрутки вверх и просмотра предыдущего вывода. Существуют и другие параметры, которые позволяют использовать полосы прокрутки, но ни один из них, по-видимому, не позволяет выводить данные по ним.

Редактировать: я нашел пример, который намеревается сделать это, но я, честно говоря, не понимаю, как это работает или как его перевести на пример find / -name "a*" . см. последний пример на http://mywiki.wooledge.org/BashFAQ/040

Редактировать 2: Единственное требование - это использование диалога (или что-то в этом роде, позволяющее использовать ncurses, такие как gui для командной строки и родные графические окна, если X доступен).

3 ответа3

2

--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, соответственно)

0

Просто перенесите свою команду на more и вы сможете использовать стандартные клавиши перемещения BASH (или вверх / вниз) для перемещения по выходу. В твоем случае...

find / -name "a*" | more

... должен сделать свое дело.

0

Вам нужно будет создать временный файл для этого:

file=$(mktemp)
cat > "$file"
dialog --textbox "$file" 0 0
rm "$file"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .