アクティブな端末エミュレータで実行されているアプリケーションのPIDを取得します。

アクティブな端末エミュレータで実行されているアプリケーションのPIDを取得します。

urxvt私の究極の目標は、現在アクティブなウィンドウで実行されているプログラムの現在の作業ディレクトリから直接新しいターミナルウィンドウ()を開くことです。

私は現在シェルを使用していますが、代わりに反対するものはありません。

これまで、次のコマンドを使用して現在アクティブなウィンドウのIDを取得しましたxdotool

wid=$(xdotool getactivewindow)

以下を使用するプロセスのPID xprop:

pid=$(xprop -id $wid _NET_WM_PID | awk '{print $NF}')

しかし、これは私が探しているPIDではありません。 端末で実行されているプロセスのPIDをこのウィンドウに表示したいと思います。 現在は主にそのウィンドウでシェルが実行される場合を望んでいますbashが、なぜそれに依存するのか理解できません。

すでに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。このような場合、私ができることはあまりありません。

関連情報