예시 #1

예시 #1

Bash를 가지고 놀고 있는데 coproc뭔가 이해할 수 없습니다.

다음 예부터 시작하겠습니다.

예시 #1

$ coproc MY_BASH { bash; }
[1] 95244
$ echo 'ls -l; echo EOD' >&"${MY_BASH[1]}"
$ is_done=false; while [[ "$is_done" != "true" ]]; do
>   read var <&"${MY_BASH[0]}"
>   if [[ $var == "EOD" ]]; then
>      is_done="true"
>   else
>      echo $var
>   fi
> done
total 0
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file10.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file1.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file2.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file3.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file4.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file5.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file6.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file7.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file8.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file9.txt
$ 

여기서는 현재 Bash 셸이 공동 프로세스를 생성하고 상호 작용할 수 있음을 알 수 있습니다.

실시예 2

이 경우 bashcoprocess에서 coprocess로 전환합니다 python.

$ coproc MY_BASH { python; }
[1] 95244
$ echo 'print("hello"); print("EOD");' >&"${MY_BASH[1]}"
$ is_done=false; while [[ "$is_done" != "true" ]]; do
>   read var <&"${MY_BASH[0]}"
>   if [[ $var == "EOD" ]]; then
>      is_done="true"
>   else
>      echo $var
>   fi
> done

이 경우 프로그램이 중단되고 차단됩니다.

입력에 뭔가를 보내는 것을 잊어버린 것 같습니다.

무슨 일이 일어나고 있는지 더 잘 이해하는 데 도움을 주시면 대단히 감사하겠습니다.

답변1

여기에 몇 가지 질문이 있습니다 ...

먼저 -iPython의 옵션을 사용하여 대화형 모드로 전환하고 stdin에서 명령을 읽어 실행해야 합니다. 그래서:

coproc MY_BASH { python -i ; }

다음으로 Python은 명령을 구분하기 위해 세미콜론을 사용하지 않으므로 명령을 구분하려면 줄 바꿈을 사용해야 합니다.

echo $'print("Hello, World!")\nprint("EOD")' >&"${MY_BASH[1]}"

관련 정보