我想要实现的目标的解释:
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
这是调试输出,它清楚地显示脚本只是中途突然停止并没有执行 当包处于活动状态时循环和 软件包不再有效后的 touch 命令(显然我手动关闭了文件管理器以便有机会触发)
$ 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” - 测试此输出:
[ "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
不会运行。