我正在执行该命令来测量 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