我的最终目标是能够urxvt
直接在当前活动窗口中运行的程序的当前工作目录中打开一个新的终端窗口 ( )。
我目前正在使用 shell (Bash),但我对替代方案没有任何反对意见。
到目前为止,我已经使用以下命令获取了当前活动窗口的 ID xdotool
:
wid=$(xdotool getactivewindow)
及其进程的 PID 使用xprop
:
pid=$(xprop -id $wid _NET_WM_PID | awk '{print $NF}')
但这不是我要找的PID。
我希望在该窗口中显示终端中运行的进程的 PID。
目前,我主要想要bash
在该窗口中运行 shell 的情况,但我不明白为什么它会依赖于此。
我已经可以使用 PID 从 PID 获取 CWD cwd="$(readlink /proc/$pid/cwd)"
。
答案1
或许:
readlink "/proc/$(
pgrep -P "$(xdotool getactivewindow getwindowpid)" | head -n1
)/cwd"
即使用 获取与窗口关联的 pid xdotool
,使用pgrep
获取该进程的子进程列表,head -n1
仅选择第一个,然后使用readlink
获取工作目录。
不适用于每个窗口。例如,不适用于来自远程客户端的窗口或不向窗口管理器提供其 PID 的窗口,不适用于其他用户的进程。
答案2
知道了!谢谢斯蒂芬·查泽拉斯寻求帮助。诀窍是寻找子进程......天啊!
我的脚本现在是:
#!/usr/bin/env bash
ppid=$(xdotool getactivewindow getwindowpid) # PID of process in the window
pid=$(pgrep -P $ppid | tail -n1) # PID of the last child
cwd="$(readlink /proc/${pid:-$ppid}/cwd)" # current CWD of pid, or ppid if no pid
cd "$cwd"
"$@"
您只需在任何命令前面加上脚本名称即可使用它,例如。incwd urxvt
。
唯一需要注意的是,某些程序(例如evince
,重置其cwd
.我怀疑在这些情况下我能做些什么。