Почему выполняется следующий оператор 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