Intereting Posts
Как решить проблему диспетчера окон в Linux Mint 14 Xfce после установки LXDE? Хвост – последний файл журнала как заставить rsync связывать идентичные файлы с параметром -link-dest, если старый файл уже существует? в котором файл является псевдонимом имен хостов, если нет / etc / hosts? Помощь при написании скрипта, который входит в систему и выходит из ssh-сервера Синхронизация двух папок и при успешном копировании одного файла из одного места в другое wget рекурсивный только для файлов, которые передают регулярное выражение Как восстановить отображение окна после отсоединения и повторной загрузки второго монитора? ssh терпит неудачу tmux vs. GNU Screen DNF. Как найти, к какому пакету группы относится? Что может привести к тому, что мой жесткий диск начнет вращаться? awk: печатать строки после матча до конца файла Удалите все файлы / каталоги, за исключением одного файла Сделать файлы Samba доступными

Получить PID приложения, запущенного в эмуляторе активного терминала

Моя конечная цель – открыть новое окно терминала ( urxvt ) непосредственно в текущем рабочем каталоге программы, запущенной в текущем активном окне.

В настоящее время я использую оболочку (Bash), но у меня нет ничего против альтернатив.

До сих пор у меня есть идентификатор текущего активного окна с помощью xdotool :

 wid=$(xdotool getactivewindow) 

и PID его процесса с использованием xprop :

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

но это не тот PID, который я ищу. Я хочу, чтобы PID процесса работал в терминале, отображаемом в этом окне. На данный момент я в основном хочу, чтобы в этом окне запускалась оболочка bash , но я не понимаю, почему это будет зависеть от этого.

Я уже могу получить CWD из PID, используя cwd="$(readlink /proc/$pid/cwd)" .

Может быть:

 readlink "/proc/$( pgrep -P "$(xdotool getactivewindow getwindowpid)" | head -n1 )/cwd" 

Это получить pid, связанный с окном с помощью xdotool , использовать pgrep для получения списка дочерних элементов этого процесса, head -n1 только выбрать первый и использовать readlink для получения рабочего каталога.

Не будет работать для каждого окна. Например, не для окон от удаленных клиентов или которые не предоставляют оконному менеджеру свой PID, а не для процессов другими пользователями.

Понял! Спасибо Стефану Хазеласу за помощь. Хитрость заключалась в том, чтобы искать детские процессы … О, да!

Теперь мой скрипт:

 #!/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 . Я сомневаюсь, что я могу что-то сделать в этих случаях.