0

アプリが実行されているかどうかを確認する「if」ステートメントが機能しません。これは常に「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」ステートメントのみを変更できることに注意してください。

4

1 に答える 1

1

ここにはいくつかの問題があります。投稿では明記していませんが、特に「Skype」というアプリを探しているようです。ただし、角括弧は grep では特別な意味を持ちます。それらは囲まれた文字のいずれかを意味します。ただし、角かっこを入れ子にすることで、基本的に何にも一致しないことを保証します。( Grep ambiguity ネストされた角括弧を参照してください。)

これが、一致するものがないため、常に「停止」と報告される理由です。

おそらく、次のようなものが必要です。

ps aux | grep "Skype"

ただし、これを実行すると、代わりに always runningと報告されることがわかります。これは、grep プロセスにも目的のテキストが含まれているため、これは実際には grep 自体と一致するためです。この問題を解決するには、何らかの方法で grep プロセスを一致リストから削除する必要があります。(これが角括弧の目的だった可能性があります。コメントを参照してください。) 1 つの方法は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ステートメントのみであることに注意してください。

(また、検索にはスペースが含まれていないため、検索を囲む引用符は不要であることに注意してください。それらを削除することで読みやすさを向上させることができます。ただし、それらを使用してもスクリプトに影響はありません。)

于 2015-03-03T19:33:41.317 に答える