Android adb 쉘에서 실행할 간단한 쉘 스크립트가 있습니다.
while true; do
read var1
echo $var1 > /data/local/tmp/debug.txt
am force-stop $var1
done
원래 쉘 인스턴스의 콘솔에 값을 입력하면 정상적으로 작동합니다. 그러나 다른 adb 셸을 열고 첫 번째 프로세스에 데이터를 전달하려고 하면 다음과 같습니다.
echo "com.package.name" > /proc/XXXX/fd/0
여기서 XXXX는 첫 번째 셸의 pid입니다. "com.package.name" 문자열이 첫 번째 셸의 에 도착 read
하지만 디버그 echo
줄이나 am
줄이 실행되지 않는 것만 볼 수 있습니다. 그것은 스크립트가 개행 문자와 같은 무언가를 기다리고 있는 것처럼 보이지만 두 번째 셸 입력에 \n
, -e
인수 및 기타 항목을 추가해도 도움이 되지 않았습니다.
쉘 스크립트 간에 데이터를 올바르게 전달하려면 어떻게 해야 합니까?
답변1
당신은 일반적인 개념에 의해 길을 잃고 있습니다.Linux 시스템의 모든 것은 파일입니다. 이를 설명하기 위해 명령을 이라는 파일에 넣은 다음 forever
프로세스의 PID를 찾은 다음
$ file /proc/25546/fd/*
/proc/25546/fd/0: symbolic link to `/dev/pts/12'
/proc/25546/fd/1: symbolic link to `/dev/pts/12'
/proc/25546/fd/2: symbolic link to `/dev/pts/12'
/proc/25546/fd/255: symbolic link to `/home/me/tmp/forever'
$ file /dev/pts/12
/dev/pts/12: character special
이는 파일 설명자 1,2,3이 문자 파일임을 보여줍니다. 이제는 잘 알려져 있습니다(예를 들어 참조).Unix 및 Linux에 대한 이 답변) 저것:
문자 장치(문자 특수 파일이라고도 함)는 파이프, 직렬 포트 등과 같이 작동합니다. 여기에 쓰거나 읽는 것은 즉각적인 작업입니다. 하지만 운전자가 데이터를 가지고 하는 일은자신의 사업. 문자 장치에 바이트를 쓰면 화면에 표시되고, 직렬 포트에 출력되고, 사운드로 변환될 수 있습니다. 장치에서 바이트를 읽으면 직렬 포트가 입력을 기다리거나 무작위로 반환될 수 있습니다. 바이트(/dev/urandom), ...
따라서 IPC(=Inter Process Communication)를 수행하는 다른 방법이 필요합니다.유닉스와 리눅스에서, 있다 명명된 파이프이를 위해. 다음과 같이 스크립트를 수정합니다.
#!/bin/bash
MYPIPE=/tmp/my_pipe
if [[ ! -p $MYPIPE ]]; then
mkfifo $MYPIPE
fi
while true
do
if read line <$pipe; then
if [[ "$line" == 'quit' ]]; then
break
fi
echo $line >> /tmp/debug.txt
fi
done
echo "I quit"
스크립트를 시작하십시오. 다른 터미널 유형에서
$ cat > /tmp/my_pipe
My name is
George Washington
....
세 번째 터미널에서 를 사용하면 tail -f /tmp/debug.txt
두 번째 터미널에 방금 입력한 내용이 에서 다시 나타나는 것을 볼 수 있습니다 /tmp/debug.txt
.
안드로이드에서, 상황은 좀 더 복잡하지만여기그리고여기루팅되지 않은 Android 기기에서 명명된 파이프를 만드는 문제를 해결하는 두 가지 별개의 방법입니다(첫 번째 방법은 두 번째 방법보다 간단합니다).