通过管道将命令输出传输到 Yad,并将输出记录到日志文件中

通过管道将命令输出传输到 Yad,并将输出记录到日志文件中

需要使用命令流程(通常是更新)来显示亚德同时将所有输出记录到给定的日志文件设置中。这是我的

apt-get update | yad --width=400 --height=300 \
--title="Updating debian package list ..." --progress \
--pulsate --text="Updating debian package list ..." \
--auto-kill --auto-close \
--percentage=10 

上面的命令为进程创建一个脉动指示器并在完成时关闭,但我需要让它记录我尝试过的所有输出

apt-get update >>${logfile} 2>&1 | yad --width=400 --height=300 \
--title="Updating debian package list ..." --progress \
--pulsate --text="Updating debian package list ..." \
--auto-kill --auto-close \
--percentage=10 

但这给了我一个错误,并且在没有对话框和没有日志记录的情况下挂起,只是冻结。这是错误

 GLib-CRITICAL **: g_source_remove: assertion `tag > 0' failed

感谢帮助

答案1

该错误是因为您将所有输出重定向到,$logfile因此没有要yad处理的输出。您正在寻找的工具是tee

NAME
       tee - read from standard input and write to standard output and files

SYNOPSIS
       tee [OPTION]... [FILE]...

DESCRIPTION
       Copy standard input to each FILE, and also to standard output.

所以,你可以这样做:

apt-get update 2>&1 | tee -a ${logfile} |
  yad --width=400 --height=300 \
    --title="Updating debian package list ..." --progress \
    --pulsate --text="Updating debian package list ..." \
    --auto-kill --auto-close \
    --percentage=10 

答案2

另一种可能性是将输出定向apt-get到日志文件中,在后台运行此进程,然后yad使用以下命令将该日志文件的增加“虹吸”到带有进度条的窗口中tail -f

apt-get update > "$logfile" & tail -f "$logfile" | yad --width=400 --height=300 \
--title="Updating debian package list ..." --progress \
--pulsate --text="Updating debian package list ..." \
--auto-kill --auto-close \
--percentage=10

相关内容