如何让watch命令正确处理 (回车符)?
问题:watch命令无法正确解析文件中的回车符(\r)实现内容覆写
当监控的文件用回车符(\r)实现内容覆写(比如进度条)时,watch命令会忽略这些回车符,导致内容无法正确覆写,示例如下:
- 创建包含回车符的测试文件:
$ echo -e "Looooong-string \r short-string" > test.txt
- 用
cat查看时,回车符会正确覆写内容:
$ cat test.txt short-stringng
- 但用
watch执行cat时,回车符被忽略,内容直接拼接:
$ watch cat test.txt Every 2.0s: cat test.txt Sun Aug 28 21:39:59 2022 Looooong-string short-string
解决方法
方法1:启用watch的控制字符支持
watch默认过滤了部分控制字符,加上-c参数可以保留ANSI控制字符(包括回车符),执行命令:
watch -c cat test.txt
此方法能让回车符正常触发内容覆写,是最简单直接的方案。
方法2:用script命令模拟终端环境
如果-c参数不生效,可通过script创建伪终端,让命令输出像在真实终端中一样解析控制字符:
watch 'script -qec "cat test.txt" /dev/null'
-q为静默模式,-e保证脚本退出码正确,/dev/null用于丢弃日志文件。
方法3:自定义监控脚本
直接写一个简单的循环脚本替代watch功能,手动处理终端刷新和回车符解析:
#!/bin/bash while true; do clear cat test.txt sleep 2 done
保存为custom_watch.sh,赋予执行权限后直接运行:
chmod +x custom_watch.sh ./custom_watch.sh
内容的提问来源于stack exchange,提问作者Azuresonance
相关产品推荐
相关产品推荐

