Здесь есть пара проблем. Вы не укажете его в своем сообщении, но вы, похоже, смотрите конкретно на приложение «Skype». Квадратные скобки, однако, имеют особое значение в grep: они означают любой из закрытых символов. Но, вложив квадратные скобки, вы в основном гарантируете, что он ничего не будет соответствовать. (См. Grep ambiguity nested square bracket в другом месте.)
Именно поэтому он всегда сообщает «остановлен», потому что ничего не соответствует.
Вы, вероятно, хотите что-то больше похоже:
ps aux | grep "Skype"
Однако, если вы запустите это, вы обнаружите, что, вместо этого, он сообщает, как всегда работает. Это потому, что это фактически соответствует самой grep, так как grep-процесс также содержит нужный текст. Чтобы исправить эту проблему, вам нужно как-то удалить процесс grep из списка совпадений. (Это может быть, что ваши квадратные скобки были для, см комментариев.) Один из способов заключается в использовании grep -v
, чтобы исключить строки, которые соответствуют:
ps aux | grep "Skype" | grep -v "grep"
Это должно делать то, что вы хотите. Я тестировал его с упрощенной формой вашего сценария и правильно сообщается, было ли названо приложение работает или не работает:
#!/bin/bash
osascript -e "do shell script \"
if (ps aux | grep Skype | grep -v grep > /dev/null)
then
echo RUNNING
else
echo STOPPED
fi
\""
Обратите внимание, что в то время как я упростил остальную часть вашего сценария, чтобы сделать его легче проверить, важным изменение находится только в заявлении if
.
(Заметим также, что, поскольку ваши поиски не содержат пробелы, кавычки вокруг поисков излишни.. Вы можете улучшить читаемость, удаляя их это не повредит сценарий, чтобы иметь их, однако)
Try заставляя его работать без osascript сначала –
@ совет thatotherguy также хорош: во-первых, сделайте линию ps работать в командной строке; только когда вы это понимаете, если вы сложите его в оператор * if *. –