쉘 스크립트 간 입력 데이터 교환

쉘 스크립트 간 입력 데이터 교환

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 기기에서 명명된 파이프를 만드는 문제를 해결하는 두 가지 별개의 방법입니다(첫 번째 방법은 두 번째 방법보다 간단합니다).

관련 정보