用管道反转if语句

时间:2019-03-30 22:17:08

标签: bash if-statement

我想向我的.bash_profile添加一个命令,以运行一个脚本(如果尚未运行)。以下是我的尝试。

if ps ax | grep reminder.py | grep -v grep;
  echo 'i want to get rid of this line'
then
  python /Users/Jesse/Dropbox/reminder/reminder.py &
fi

我不知道反转if语句的语法。

我尝试了很多类似的东西:

if ! ps ax | grep reminder.py | grep -v grep
then
  python /Users/Jesse/Dropbox/reminder/reminder.py &
fi

我的尝试都没有成功。

如果相关,我正在macOS上运行。

1 个答案:

答案 0 :(得分:3)

在bash中,server.js表示取反。因此,无需进行任何其他更改,您可以使用:

!

但是您可能想消除grep输出,因此请使用if ! ps ax | grep reminder.py | grep -v grep then python /Users/Jesse/Dropbox/reminder/reminder.py & fi 保持安静:

-q

如果我们更聪明地使用grep的正则表达式,则可以简化管道(提示:Gordon Davisson):

if ! ps ax | grep reminder.py | grep -q -v grep
then
  python /Users/Jesse/Dropbox/reminder/reminder.py &
fi

以上方法之所以有效,是因为if ! ps ax | grep -q "reminder[.]py" then python /Users/Jesse/Dropbox/reminder/reminder.py & fi 不能匹配reminder[.]py,但不能匹配reminder[.]py。您可以在命令行上对此进行测试:

reminder.py

如您所见,只有上面的第二个命令显示匹配项。

另外,如果$ echo 'reminder[.]py' | grep 'reminder[.]py' $ echo 'reminder.py' | grep 'reminder[.]py' reminder.py 在您的系统上可用,则不需要管道:

pgrep

对于那些喜欢一种衬垫的人,以上简化为:

if ! pgrep -f reminder.py >/dev/null
then
  python /Users/Jesse/Dropbox/reminder/reminder.py &
fi

上面的pgrep -f reminder.py >/dev/null || python /Users/Jesse/Dropbox/reminder/reminder.py & 是逻辑或。只有在||之后的命令失败(退出非零返回码)的情况下,该命令才会执行。