Bash 脚本不执行某些命令

Bash 脚本不执行某些命令

我想要实现的目标的解释:

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不会运行。

相关内容