Process
獲取在活動終端模擬器中執行的應用程序的 PID
我的最終目標是能夠
urxvt
直接在目前活動視窗中執行的程序的目前工作目錄中打開一個新的終端視窗 ()。我目前正在使用外殼(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)"
。
知道了!感謝Stephane Chazelas的幫助。訣竅是尋找子程序…… D’oh!
我的腳本現在是:
#!/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
. 我懷疑在這些情況下我能做些什麼。
也許:
readlink "/proc/$( pgrep -P "$(xdotool getactivewindow getwindowpid)" | head -n1 )/cwd"
即使用 獲取與視窗關聯的 pid
xdotool
,使用pgrep
獲取該程序的子程序列表,head -n1
僅選擇第一個,並使用readlink
獲取工作目錄。不適用於每個視窗。例如,不適用於來自遠端客戶端或不向視窗管理器提供其 PID 的視窗,不適用於其他使用者的程序。