我的"如果"负责检查应用程序是否正在运行的语句不起作用。它总是返回" false" 这是一个script.sh:
#!/bin/bash
osascript -e "do shell script \"
if (ps aux | grep "[[S]kype]" > /dev/null)
then
echo "RUNNING" > /Users/someuser/Desktop/RUNNING.txt
else
echo "STOPPED" > /Users/someuser/Desktop/STOPPED.txt
fi
\" with administrator privileges"
结果脚本创建" STOPPED.txt"即使申请已经启动。
如何解决以下问题?
请注意,我只能更改" IF"言。
答案 0 :(得分:1)
这里有几个问题。您没有在帖子中指定它,但您似乎专门寻找应用程序“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
语句中。
(另请注意,由于您的搜索不包含空格,因此搜索周围的引号是多余的;您可以通过删除它们来提高可读性。但是,使用它们不会影响脚本。)