Подтвердить что ты не робот

Почему "если $(ps aux | grep...)" всегда преуспевает в Bash?

Почему выполняется следующий оператор if?

if $(ps aux | grep -q "bla bla") ; then echo "found" ; fi
4b9b3361

Ответ 1

Потому что сам процесс grep возвращается ps. Вы можете "обмануть" grep, чтобы не соответствовать себе, окружая один из символов поиска в классе символов [ ], который не меняет функциональность: Просто выполните:

if ps aux | grep -q "[b]la bla" ; then echo "found" ; fi

Кроме того, использование замены процесса $() не требуется. if будет работать над успехом последней команды в цепочке труб, которая вам нужна.

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

Ответ 2

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

ps aux | grep -v "grep" | grep "Finder"

Ответ 3

процесс grep уже запущен временем выполнения ps, поэтому вывод ps включает его.

Попробуйте вместо этого использовать pgrep.

pgrep именно для этой цели:

if pgrep "bla bla" ; then echo "found" ; fi

Ответ 4

$( является маленьким, немного значимым, и немного меняет значение. Хотя в этом случае, поскольку из grep -q нет выхода, вы можете просто уйти с $(. Вы, вероятно, хотите начать с чего-то вроде (как указывали другие):

if ps aux | grep -v 'grep' | grep -q 'bla bla'; then
    echo 'Found'
fi

В любом случае, вы начали с

if $(ps aux | grep -q "bla bla") ; then echo "found" ; fi

С $( выполняется команда внутри $( ), а выход этой команды используется в качестве командной строки для внешней команды. Сделайте эти четыре эксперимента:

# if $(echo nonexistant ; true) ; then echo "found" ; fi
nonexistant: command not found

# if $(echo nonexistant ; false) ; then echo "found" ; fi
nonexistant: command not found

# if $(echo  ; true) ; then echo "found" ; fi
found

# if $(echo  ; false) ; then echo "found" ; fi

Итак, в соответствии с этим вы выведете get found, если выполняются оба этих условия:

  • Команда внутри $( ) не создала выход
  • и команда была успешной

Это говорит о том, что ps aux | grep -q "bla bla" был успешным и не создал выход. Неудивительно, что grep -q не создает выход. Это для -q. Поэтому ваша команда должна иметь истинный статус, что означает, что grep успешно нашел совпадение. Мы знаем, что grep всегда найдет совпадение в этом случае, потому что список процессов из ps будет включать сам grep; grep всегда найдет себя.

Ответ 5

Вам нужно отфильтровать процесс grep ping для 'bla bla':

$ if ps aux | grep -v 'grep' | grep -q 'bla bla'; then
    echo 'Found'
fi