Что означает ps –ax | grep $$ > поймать?

В 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
0
15.03.2021, 08:01
2 ответа

Команда ps -axотображает как ваши, так и процессы других пользователей.

grepсоответствует строкам, которые соответствуют регулярному выражению. В этом случае используется регулярное выражение $$, которое оболочка расширит до идентификатора процесса текущей оболочки.

Угловая скобка(>)перенаправляет вывод в файл с именем catch. Если файл существует, он сначала будет усечен (и очищен ), в противном случае он будет создан.

2
18.03.2021, 22:25

Это не лучший способ делать вещи. Вы просите ps показать:

  • Все ваши процессы (по умолчанию)
  • плюс -все остальные процессы, у которых есть tty (опция)
  • плюс -все остальные процессы, у которых нет tty, а также (опция x)
  • , затем -отфильтруйте с помощью 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 родителя.

Какой из них правильный? Это зависит от того, что вы пытаетесь сделать. Если я ищу основную оболочку, я обычно сначала устанавливаю ее в переменную, чтобы было ясно, что это то, что мне нужно.

0
18.03.2021, 22:25

Теги

Похожие вопросы