私が達成したいことの説明:
1)スクリプトが実行されたら、まずパッケージ名が「com.mixplorer」のファイルマネージャが有効になっていることを確認し、有効になっている場合は強制停止してからもう一度開き、それ以外の場合は開きます。
2)ファイルマネージャが開かれたので、ファイルマネージャプロセスの実行中にループから10秒ごとにLoopcleanerによって定義された「log.txt」というファイルを削除し続けます。
3)ファイルマネージャがアクティブになっていない場合にのみ、手順2のループクリーンアッププロセスを終了し、Success.txtというファイルを作成します。これですべてが完了したため、スクリプトが終了する可能性があります。
これは私のスクリプトです。
#!/bin/bash
PACKAGE='com.mixplorer'
if [ $(pidof $PACKAGE) ];
then
am force-stop com.mixplorer && am start -n com.mixplorer/.activities.BrowseActivity;
else
am start -n com.mixplorer/.activities.BrowseActivity;
fi
loopcleaner()
{
rm -rf /sdcard/log.txt
}
while [ $(pidof $PACKAGE) ];
do
loopcleaner;
sleep 2;
if [ ! $(pidof $PACKAGE) ];
then
break
touch /sdcard/successful.txt
fi
exit 0;
done
以下はデバッグ出力です。スクリプトが途中で停止して実行されなかったことを明確に示しています。 パッケージがアクティブな間にループそして パッケージ以降のタッチコマンドは無効です。(明らかにトリガーする機会を与えるためにファイルマネージャを手動で閉じました)
$ su -c sh -x /sdcard/tester.sh
+ PACKAGE=com.mixplorer
+ pidof com.mixplorer
+ '[' ']'
+ pidof com.mixplorer
+ '[' ! ']'
+ am start -n com.mixplorer/.activities.BrowseActivity
Starting: Intent { cmp=com.mixplorer/.activities.BrowseActivity }
+ pidof com.mixplorer
+ '[' ']'
$
答え1
主な問題は次のとおりです。if [ $(pidof "$package") ]
コマンドが実行するアクションは次のとおりです。
- 解決
"$package"
、仮説foo
pidof foo
空または「多分」出力を実行して維持します。- この出力をテストします。
[ "blah" ]
または[ ]
これはあなたが望むものではないかもしれません。
(コマンドの出力と戻りコードが間違っています。)
必要なのは(pidof
パッケージが見つかったときに戻りコードがtrueの場合)
if pidof "$package"
または(pidof
パッケージが見つかった場合は正の整数を返し、0
パッケージが見つからない場合は正の整数を返します)
if [ $(pidof "$package") != 0 ]
または(pidof
あなたの追跡によると、結果が見つからない場合は何も返されません)
if [ -n "$(pidof "$package")" ]
then (.. found ..)
else ( .. not found ... )
fi
以下にも適用されます。while
ちなみに、touch
それ以降は実行されませんbreak
。