adb 쉘 명령의 결과를 평가하는 방법은 무엇입니까?

adb 쉘 명령의 결과를 평가하는 방법은 무엇입니까?

예를 들어 전화기에 디렉터리가 있는지 확인하고 싶습니다.

R=$(adb shell 'ls /mnt/; echo $?' | tail -1);

$ echo $R
0

$ if [ "$R" -ne 0 ]; then echo "Path doesn't exist"; else echo "Path exists"; fi
: integer expression expected
Path exists

R에 무슨 문제가 있나요? 좋아요, 확실히 0인 다른 변수를 사용해 보세요.

$ x=0
$ if [ "$x" -ne 0 ]; then echo "Path doesn't exist"; else echo "Path exists"; fi

Path exists

$ echo "|$x|"
|0|

$ echo "|$R|"
|0

두 번째 파이프는 인쇄되지 않습니다. 0 뒤에 문자가 있나요? 가지치기를 시도해보세요:

$ R=$(adb shell 'ls /mnt/; echo $?' | tail -1 | xargs)
$ echo "|$R|"
|0

아이디어가 부족해요.

답변1

adb개행 앞에 캐리지 리턴 문자(일명 0x0d, Ctrl-M등) 를 추가합니다. \r아마도 Windows 소프트웨어에서 사용하기 쉽도록 소프트웨어에서는 줄이 LF가 아닌 CR-LF로 끝날 것으로 예상합니다.

hexdumpaka 를 사용하여 직접 확인할 수 있습니다 hd. 예를 들면 다음과 같습니다.

$ printf "$R" | hd
00000000  30 0d                                             |0.|
00000002

값(종료 코드)만 반환하면 되기 때문입니다. printf대신 사용 echo하고 모든 ls출력을 Android 장치로 리디렉션하여 /dev/null줄바꿈 인쇄를 방지할 수 있습니다. 그러면 adb가 CR을 추가하지 않습니다.

R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; printf $?')"

Android 기기에 해당 항목이 없거나 printfAndroid 셸에서 하나 이상의 출력 줄을 반환해야 하는 경우 tr -d '\r'또는 유사한 기능 dos2unix을 사용하여 sed 's/\r$//'CR을 제거할 수 있습니다.

dos2unixLF 바로 다음 CR만 제거하고 줄의 다른 곳에 있을 수 있는 CR은 남겨두기 때문에 sed여기보다 더 나은 옵션이 있습니다 .tr

$ R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; echo $?' | dos2unix)"
$ printf "$R" | hd
00000000  30                                                |0|
00000001

답변2

또 다른 답변은 질문자가 어디에서 잘못되었는지를 아주 잘 설명합니다. 이야기의 교훈은 adb가 일부를 추가할 수 있으므로 문자 수를 세는 데 주의해야 한다는 것입니다.

나는 결국 이 일을 하게 되었다

R=$(adb shell 'ls /mnt && echo SUCCESS || echo FAIL' | egrep (SUCCESS|FAIL))
echo $R

관련 정보