如何在fish shell中向zenity进度条实时刷新输出?
在fish shell中实现zenity实时进度条的方法
我懂你碰到的问题——bash里用管道给zenity传进度值能实时更新进度条,但换到fish shell后,循环得跑完所有迭代才会一次性把所有输出传给zenity,进度条根本没法实时动起来。
这其实是因为fish对管道命令的输出缓冲策略和bash不一样:bash默认对管道中的行输出用行缓冲,而fish会用块缓冲,只有当缓冲区满了或者命令结束时才会把内容传给下一个命令。
要解决这个问题,我们可以强制让循环的输出无缓冲,这里有两个实用的方法:
方法一:用stdbuf禁用输出缓冲
stdbuf可以控制命令的缓冲行为,-o0参数表示让标准输出完全无缓冲,这样每一次echo的内容都会立刻传给zenity:
stdbuf -o0 for i in (seq 90 100); echo $i; sleep 1; end | zenity --progress
方法二:用script模拟终端环境
如果你的系统没有stdbuf,可以用script命令——它会创建一个伪终端,而终端环境默认是行缓冲的,这样也能实现实时输出:
script -q /dev/null -c 'for i in (seq 90 100); echo $i; sleep 1; end' | zenity --progress
这里-q是静默模式,/dev/null用来丢弃script本身的日志输出,-c后面跟着要执行的循环命令。
试试这两个方法,进度条应该就能像bash里那样实时更新啦!
内容的提问来源于stack exchange,提问作者djsumdog
相关产品推荐
相关产品推荐

