bashスクリプトでpgrepを正しく使用する方法は?

bashスクリプトでpgrepを正しく使用する方法は?

私はGUIプログラムを実行しています。熱狂(srcでコンパイル)実行可能ファイルにスクリプト(zeal.sh)を追加します。

#!/bin/bash

if pgrep zeal &>/dev/null; then
    printf "already on\n"
else
    ~/tools/zeal/zeal/zeal &>/dev/null &
fi

奇妙なことは、このスクリプトをこのように実行すると/path/to/zeal.sh常に「すでに開始済み」というメッセージが表示されますが、bash /path/to/zeal.shこれを使用すると、プロセスが実行中かどうかが正しく判断されることがあります。

また、同様のスクリプト(Firefoxなど)を使用して他のGUIプログラムを調べましたが、正常に動作します。

それでは、このようなことがどのように発生し、どのように解決しますか?

答え1

Haukeの回答で提案されている長いオプションは、--exact一部のシステムでは機能しません。代わりに、同等の短いオプションを使用できます-x

#!/bin/bash

if pgrep -x "zeal" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

答え2

問題は、直接呼び出しがスクリプト名をコマンド名にすることです。

cat /proc/$PID/comm

その結果、pgrep一致します。経由で呼び出される場合、bashコマンド名は「bash」です。

使用

pgrep --exact zeal

代わりに。

関連情報