urxvt
나의 궁극적인 목표는 현재 활성 창에서 실행 중인 프로그램의 현재 작업 디렉터리에서 직접 새 터미널 창()을 열 수 있는 것입니다 .
현재 쉘(Bash)을 사용하고 있지만 대안에 반대되는 것은 없습니다.
지금까지 다음 명령을 사용하여 현재 활성 창의 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
. 이러한 경우에 제가 할 수 있는 일이 많지 않을 것 같습니다.