如何让命令自行刷新而无需编写 .sh 脚本?

如何让命令自行刷新而无需编写 .sh 脚本?

我正在执行该命令来测量 RAM 使用情况:

while sleep 1; do free && echo -e && ps -eo rss | awk '{sum+=$1} END {print sum}' && echo -e "\n"; done

但是,它仍会继续打印新的输出,而不是擦除/覆盖上一个输出。

目标是使该命令看起来像 top 或 htop 行为。

所以问题是:如果不编写 shell 脚本,如何让命令自行刷新?


我偶然发现了这一点:https://askubuntu.com/a/684887

这样printf "\033c"可行,但问题是它的行为像重置一样,除了最后一个输出之外清除整个终端。

此外,watch也有效,但退出它不会保留最后的输出,就像 top 那样。

 

有没有办法将两者混合在一起?比如模仿 top 的行为?

Top 会自动刷新,而不会重置整个终端,并且在退出时保留最后的输出。

答案1

使用watch命令。要运行你指定的命令,例如:

watch -n 1 'free -t && echo && ps -eo rss | awk '\''{sum+=$1} END {print sum}'\'' && echo'

要特别注意命令周围的特殊引用,awk必须将单引号放在单引号内。

watch以指定的间隔(这里是 1 秒,带有标志)运行程序-n 1并在屏幕上显示输出的第一个屏幕,每次刷新。

如果你打算在退出后保留输出,你可以在最后再运行一次该命令。例如:

tmp='free -t && echo && ps -eo rss | awk '\''{sum+=$1} END {print sum}'\'' && echo'
watch -n 1 "$tmp" ; eval "$tmp"

我只是使用临时变量来$tmp避免两次输入整个命令。

答案2

好吧,如果你不介意清除终端窗口中的所有其他内容,你可以clear在 sleep 后添加:

while sleep 1; do clear; free -t && echo -e && ps -eo rss | awk '{sum+=$1} END {print sum}' && echo -e "\n"; done

答案3

一种解决方案是避免在子命令(例如awk)中打印,而是将所有内容放在变量中,然后在一行中打印所有内容,末尾使用 CR 而不是 LF(我printf为此使用 bash):

 printf "%10s %4d %4d\r" $dev $recvdiff $senddiff

相关内容