将命令的输出通过管道传输到对话框并允许向上滚动

将命令的输出通过管道传输到对话框并允许向上滚动

我想运行一个任意命令,例如 find / -name "a*" 我想将其输出通过管道传输到对话框。--tailbox 和 --progressbox 可以很好地处理这个问题,但如果输出太多,您只能看到屏幕适合的内容。

我需要能够使用向上/向下箭头和/或 pg up/pg dn 键向上滚动并查看上一个输出。还有其他选项允许滚动条,但似乎都不允许将输出管道传输到它们。

编辑:我找到了一个声称可以做到这一点的例子,但老实说,我不明白它是如何工作的,也不知道如何将它转化为的例子find / -name "a*"。请参见最后一个例子http://mywiki.wooledge.org/BashFAQ/040

编辑2:唯一的要求是使用对话框(或类似的东西,允许 ncurses 像命令行的 gui,以及本机 gui 框(如果 X 可用)。

答案1

--tailbox--progressbox处理好这个问题,但如果输出太多,您只能看到屏幕适合的部分。

这并不完全正确。A--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)

答案2

只需将命令输入管道more,您就可以使用标准 BASH 移动键(或向上/向下)在输出中移动。对于您来说...

find / -name "a*" | more

...应该可以解决问题。

答案3

您必须为此创建一个临时文件:

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

相关内容