Bash Zenity--来自Handbrake CLI输出的进度

Bash Zenity--来自Handbrake CLI输出的进度,bash,zenity,Bash,Zenity,我的目标是使用zenity--progress创建一个带有HandBrakeCLI输出的gtk进度条。我遇到了一些障碍,我想知道是否有人知道一个更好的方法,或者可以帮助我目前正在做的事情 正常输出: HandBrakeCLI -i infile -o outfile --preset=iPad 显示 编码:任务1/1,11.97%(72.81 fps,平均86.78 fps,ETA 00h00m43s) 手制动器通过管道连接到tr和cut命令,因此我只有zenity预期的百分比 HandBra

我的目标是使用zenity--progress创建一个带有HandBrakeCLI输出的gtk进度条。我遇到了一些障碍,我想知道是否有人知道一个更好的方法,或者可以帮助我目前正在做的事情

正常输出:

HandBrakeCLI -i infile -o outfile --preset=iPad
显示

编码:任务1/1,11.97%(72.81 fps,平均86.78 fps,ETA 00h00m43s)

手制动器通过管道连接到tr和cut命令,因此我只有zenity预期的百分比

HandBrakeCLI -i infile -o outfile --preset=iPad 2>&1 | tr -s '\r' '\n' | cut -b 24-28
我期望的结果是:

1.05 
1.06 
1.10 
1.10
但是,输出延迟了很多,有时甚至无法显示。如果我只使用tr表达式,我会在每一行上得到上面的输出,但它是包括“Encoding:task……”在内的整个输出

这就好像切断指令跟不上手刹的std。我阅读了有关使用命名管道的内容,创建了一个并将手刹的输出定向到管道,然后在另一个终端中,通过管道尝试了tr和cut命令,它导致了相同的延迟

使用awk的打印子字符串也会导致相同的延迟


我想不出来。我在寻找zenity——进度指示器,因为我的手刹作业被称为MythTV作业,我希望弹出一个进度条,以便我知道何时进行编码。

您可以使用回答的解决方案

例如:

属于GNU coreutils的
stdbuf
程序

stdbuf -i0 -o0 -e0 command

另一个例子是命令,例如

unbuffer
通过伪终端(pty)连接到
long_running_命令
,这使得系统将其视为一个交互过程,因此不使用可能导致延迟的管道中的4-kiB缓冲

对于较长的管道,您可能必须取消缓冲每个命令(最后一个命令除外),例如


使用erik建议的用于第一篇文章的UNBUFFER,以下命令可以实现此目的:

( HandBrakeCLI -i infile -o outfile --preset=iPad | 
        unbuffer -p grep -i "encoding: task " | 
        unbuffer -p cut -c24-25 ) | 
        zenity --progress --auto-close

真的是输出延迟了吗?或者zenity将%截断为仅整数部分?您可以在zenity之前使用
tee/dev/stderr
(或/dev/tty)检查是否正确。输出会因cut而延迟,但cut命令似乎无法跟上数据。我确实试过通过管道发送到zenity,但始终无法在进度条上获得更新。我想这是因为cut很难跟上。我只是尝试添加| tee/tmp/pipe1,在另一个终端中添加了tail-f/tmp/pipe1。即使不使用cut命令,我也会得到相同的延迟输出。只是通过管道引导原始手刹输出,它不会更新,但可能每10秒更新一次,更新会逐渐落后。因此,基本上,我试图找出管道中的哪个部分正在进行缓冲或以其他方式消耗时间。在tr和cut命令之间
tr-s'\r'\n'| cut-b24-28
tr可以,但不能过切。最后一个命令中有错误。我运行
unbufferxxd-ps/usr/bin/telnet | unbuffer-p less
并得到
缺少的文件名(“less--help”表示帮助)
。您的命令中标志
-p
的作用是什么?我在这里也问了这个问题@Masi:不,没有什么错。您的命令错误,因为您在上一个命令中使用了
unbuffer
。看看我对你问题的回答。
unbuffer x | unbuffer -p y | z
( HandBrakeCLI -i infile -o outfile --preset=iPad | 
        unbuffer -p grep -i "encoding: task " | 
        unbuffer -p cut -c24-25 ) | 
        zenity --progress --auto-close