Почему выполняется следующий оператор if?
if $(ps aux | grep -q "bla bla") ; then echo "found" ; fi
Почему выполняется следующий оператор if?
if $(ps aux | grep -q "bla bla") ; then echo "found" ; fi
Потому что сам процесс grep возвращается ps. Вы можете "обмануть" grep, чтобы не соответствовать себе, окружая один из символов поиска в классе символов [ ], который не меняет функциональность:
Просто выполните:
if ps aux | grep -q "[b]la bla" ; then echo "found" ; fi
Кроме того, использование замены процесса $() не требуется. if будет работать над успехом последней команды в цепочке труб, которая вам нужна.
Примечание. Причина, по которой работает трюк класса персонажа, состоит в том, что вывод ps все еще содержит скобки символьного класса, но когда grep обрабатывает строку поиска, он использует скобки как синтаксис, а не фиксированную строку для соответствия.
Если вы grep вывод из ps aux, вы всегда получите процесс, показывающий вашу предыдущую команду. Чтобы исправить это, вы можете дважды вывести вывод в grep, один раз, чтобы удалить строку с "grep" в нем, и снова для процесса, который вы ищете.
ps aux | grep -v "grep" | grep "Finder"
процесс grep уже запущен временем выполнения ps, поэтому вывод ps включает его.
Попробуйте вместо этого использовать pgrep.
pgrep именно для этой цели:
if pgrep "bla bla" ; then echo "found" ; fi
$( является маленьким, немного значимым, и немного меняет значение. Хотя в этом случае, поскольку из 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 всегда найдет себя.
Вам нужно отфильтровать процесс grep ping для 'bla bla':
$ if ps aux | grep -v 'grep' | grep -q 'bla bla'; then
echo 'Found'
fi