![将命令的输出通过管道传输到对话框并允许向上滚动](https://linux22.com/image/1367448/%E5%B0%86%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E4%BC%A0%E8%BE%93%E5%88%B0%E5%AF%B9%E8%AF%9D%E6%A1%86%E5%B9%B6%E5%85%81%E8%AE%B8%E5%90%91%E4%B8%8A%E6%BB%9A%E5%8A%A8.png)
我想运行一个任意命令,例如
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"