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

다음은 디버그 출력입니다. 스크립트가 중간에 중지되어 실행되지 않았음을 명확하게 보여줍니다. 패키지가 활성화된 동안 루프그리고 패키지 이후의 터치 명령이 더 이상 유효하지 않습니다.(분명히 트리거할 기회를 주기 위해 파일 관리자를 수동으로 닫았습니다)

$ 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.

관련 정보