В X11 вы можете использовать xprop
для прослушивания всех событий активации окна, а затем выполнять некоторую логику, которая зависит от имени класса окна.
#!/bin/bash
xprop -spy -root _NET_ACTIVE_WINDOW | grep --line-buffered -o '0[xX][a-zA-Z0-9]\{7\}' |
while read -r id; do
class="$(xprop -id $id WM_CLASS)"
if [ -n "$class" ]; then
echo "Active window class is: $class"
fi
done
Команда ps -ax
отображает как ваши, так и процессы других пользователей.
grep
соответствует строкам, которые соответствуют регулярному выражению. В этом случае используется регулярное выражение $$
, которое оболочка расширит до идентификатора процесса текущей оболочки.
Угловая скобка(>
)перенаправляет вывод в файл с именем catch
. Если файл существует, он сначала будет усечен (и очищен ), в противном случае он будет создан.
Это не лучший способ делать вещи. Вы просите ps показать:
grep
до одного процесса, который был у вас на шаге 1 Что-то такое простое, как ps -h $$ > catch
, вероятно, сделает это. ps
принимает PID интересующих вас процессов в качестве параметров командной строки, поэтому, если вы знаете, чего хотите, укажите это напрямую, а не надейтесь, что grep сработает. Опция -h
предназначена для удаления строки заголовка.
Тем не менее, вы должны быть очень осторожны с $$ в сценариях, потому что это означает "эта оболочка", но концепция this зависит от того, когда и где она вызывается.
Рассмотрим две команды:
$ sh -c "ps -ax | grep $$"
3802 pts/0 Ss 0:11 bash
3658110 pts/0 S+ 0:00 sh -c ps -ax | grep 3802
3658112 pts/0 S+ 0:00 grep 3802
$ sh -c 'ps -ax | grep $$'
3658142 pts/0 S+ 0:00 sh -c ps -ax | grep $$
3658144 pts/0 S+ 0:00 grep 3658142
Сценарии делают такие вещи все время, видите, как первый имеет 3 строки, а второй только 2? Это связано с тем, что в первом случае мы разрешаем $$
, затем запускаем скрипт и находим «основную» оболочку, а во втором мы делаем это другим способом, который, конечно, имеет другой PID дочерней оболочки и не соответствует 3802 родителя.
Какой из них правильный? Это зависит от того, что вы пытаетесь сделать. Если я ищу основную оболочку, я обычно сначала устанавливаю ее в переменную, чтобы было ясно, что это то, что мне нужно.