如何限制命令的输出在 bash 中可用的行数?

Jar*_*nen 11 bash tail nohup stdout

我开始在后台下载一个大文件使用

$ nohup wget http://example.tld/big.iso &
Run Code Online (Sandbox Code Playgroud)

这也给了我一个nohup.out包含wget.

现在,如果我以后想观看下载过程,我可以使用,$ tail -f nohup.out但这会比我希望的更快地填满我的终端窗口。我想看到的是最后一行不断更新(就像wget单独使用时一样)。

我试过了,$ tail -n 1 -f nohup.out但它似乎只影响最初的tailin'。

一般来说,如果可以限制(在这种情况下为 1)命令的输出可用/可见的行数,它将解决这个问题。有点在循环缓冲区中输出- 想想正常的进度条$ wget example.tld/big.iso会打印。

有这样的解决方案吗?

还是我爬树的方式不对?(意思是,限制nohup输出或做其他事情会更容易吗?)

jan*_*sen 10

如果您不想限制滚动区域(请参阅我的其他答案),您还可以在打印下一行之前使用回车返回到行首。有一个转义序列可以清除该行的其余部分,当当前行比前一行短时,这是必要的。

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
el="$(tput el)"; # Clear to the end of the line
tail -n 1 -f nohup.out | while read -r line; do echo -n $'\r'"$el$line"; done;
Run Code Online (Sandbox Code Playgroud)


roz*_*acz 6

你可以watch在这里使用:

watch -n 0.5 -e "tail -n 1 nohup.out"
Run Code Online (Sandbox Code Playgroud)

编辑-e(alias --exec) 选项在这里看起来很合适。特别是如果您的目标是以watch非常小的间隔运行,这会减少每个周期sh -c内部运行造成的开销watch

  • 请注意,这会每秒产生一个新的 `tail` 进程,这可能是您关心的,也可能不是您关心的。另外,一定要指定一个亚秒间隔(例如`watch -n 0.1`)来模拟“不断更新”的部分。(这显然也增加了进程和文件打开调用的数量。)最后,如果您使用的是 OS X,您可以从 MacPorts 获取 `watch`,因为它默认不可用。 (2认同)