Linux下如何每秒将.txt文件更新为指定窗口标题?
嘿,我来帮你搞定这个问题!在XFCE+Arch(Antergos)环境下用wmctrl实现窗口标题实时写入文件完全可行,大概率是你之前没精准定位目标窗口,或者循环脚本的写法有小问题。下面一步步来操作:
第一步:先确保wmctrl已安装
Arch系默认没装wmctrl,先检查一下:
wmctrl --version
如果提示命令不存在,用pacman安装:
sudo pacman -S wmctrl
第二步:获取目标窗口的唯一标识
直接用wmctrl -l会列出所有窗口,我们得精准定位要监控的那个应用。有两种稳定的方式:
- 方式一:用窗口类名(推荐,重启后不会变)
运行xprop WM_CLASS,然后点击你要监控的窗口,终端会输出类似这样的内容:
这里的第二个值(比如WM_CLASS(STRING) = "code", "Code"Code)就是窗口的类名,后面用它来匹配窗口。 - 方式二:用窗口ID
运行wmctrl -l,找到目标窗口那一行,前面的十六进制数字就是窗口ID(比如0x04a00007),不过窗口ID重启应用后会变化,不如类名稳定。
第三步:写一个持续监控的bash脚本
创建一个脚本文件,比如window-title-monitor.sh,把下面的代码粘进去(根据你选的标识方式二选一):
用窗口类名的版本(更推荐)
#!/bin/bash # 替换成你刚才拿到的窗口类名,比如Code、Firefox TARGET_CLASS="Code" # 替换成你要保存的文件路径,比如~/obs-window-title.txt OUTPUT_FILE="$HOME/obs-window-title.txt" while true; do # 过滤出目标类的窗口,取最后一个(最近激活的),提取标题部分 WINDOW_TITLE=$(wmctrl -x -l | grep "$TARGET_CLASS" | tail -1 | awk '{sub(/^[^ ]* [^ ]* /, ""); print}') # 把标题写入文件,覆盖原有内容 echo "$WINDOW_TITLE" > "$OUTPUT_FILE" # 每秒更新一次 sleep 1 done
用窗口ID的版本
#!/bin/bash # 替换成你的目标窗口ID TARGET_WINDOW="0x04a00007" OUTPUT_FILE="$HOME/obs-window-title.txt" while true; do WINDOW_TITLE=$(wmctrl -l | grep "$TARGET_WINDOW" | awk '{sub(/^[^ ]* [^ ]* /, ""); print}') echo "$WINDOW_TITLE" > "$OUTPUT_FILE" sleep 1 done
第四步:让脚本跑起来
给脚本加执行权限:
chmod +x window-title-monitor.sh
然后直接运行脚本:
./window-title-monitor.sh
如果希望开机自动运行,打开XFCE的「会话和启动」,添加这个脚本作为启动项即可。
第五步:在OBS里配置文本源
打开OBS,添加一个「文本(FreeType2)」源(XFCE下用这个更稳定),然后:
- 勾选「读取文件」选项
- 点击「浏览」选择你刚才指定的
obs-window-title.txt文件 - 勾选「自动更新(当文件改变时)」
这样OBS就会自动同步文件里的窗口标题了!
小技巧&问题排查
- 如果有多个同类型窗口,脚本里的
tail -1会取最后激活的那个窗口,如果你要监控特定的,可以在grep后面加窗口标题的关键词,比如grep "$TARGET_CLASS" | grep "My Project" - 如果wmctrl获取不到标题,试试加上
-p参数,或者确认窗口是不是被最小化了?XFCE里大部分窗口最小化后还是能获取到标题的,实在不行可以调整脚本逻辑。
内容的提问来源于stack exchange,提问作者RobotUnderscore
相关产品推荐
相关产品推荐

