如何在KDE Konsole的bash脚本中获取对应窗口的Konsole_nn编号
如何在KDE Konsole的bash脚本中获取对应窗口的Konsole_nn编号
咱们先从简单的需求入手——获取当前bash所在的Konsole窗口编号,这个其实很容易实现,因为Konsole启动shell时会把窗口的相关信息通过环境变量传递给它。
你可以直接读取$KONSOLE_DBUS_SESSION这个环境变量,然后从中提取出编号。比如在脚本里加入这段代码:
# 提取当前Konsole窗口的编号 current_konsole_num=$(echo "$KONSOLE_DBUS_SESSION" | grep -oP '(?<=konsole-)\d+') echo "当前bash所在的Konsole编号是:Konsole $current_konsole_num"
解释一下:$KONSOLE_DBUS_SESSION的格式一般是org.kde.konsole-XXXX,其中XXXX就是你要找的nn数字,用grep的正则匹配就能轻松把它抽出来。
接下来是更复杂的需求:根据指定的/dev/pts/mm来找到对应的Konsole_nn编号。这个需要结合进程信息和DBus查询来完成,步骤如下:
- 先找到对应pts的bash进程ID(PID)
- 顺着PID找到它的父进程——也就是对应的Konsole进程
- 通过DBus查询该Konsole进程对应的窗口编号
你可以用下面的脚本片段来实现:
# 替换成你要查询的pts编号,比如mm=3就写3 target_pts=3 # 1. 找到对应pts的bash PID bash_pid=$(lsof -t "/dev/pts/$target_pts" | grep -E 'bash$') if [ -z "$bash_pid" ]; then echo "没有找到对应/dev/pts/$target_pts的bash进程" exit 1 fi # 2. 找到bash的父进程(Konsole的进程) konsole_pid=$(ps -o ppid= -p "$bash_pid" | xargs) # 3. 通过DBus查询该Konsole进程对应的窗口编号 konsole_sessions=$(qdbus org.kde.konsole /Sessions) for session in $konsole_sessions; do # 获取该会话对应的进程ID session_pid=$(qdbus org.kde.konsole "$session" processId) if [ "$session_pid" -eq "$konsole_pid" ]; then # 提取会话中的编号 konsole_num=$(echo "$session" | grep -oP '(?<=Session)\d+') echo "/dev/pts/$target_pts 对应的Konsole编号是:Konsole $konsole_num" exit 0 fi done echo "没有找到对应/dev/pts/$target_pts的Konsole窗口编号"
注意:这个方法需要你的系统安装了qdbus(KDE桌面通常自带)和lsof工具,如果没有的话,用你的包管理器安装即可。
另外要提醒一下,有时候系统中会存在多个Konsole进程对应不同窗口,这个脚本会准确匹配到对应pts的bash进程的父Konsole,进而提取出正确的窗口编号。
备注:内容来源于stack exchange,提问作者Anton Wessel
相关产品推荐
相关产品推荐

