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
이 경우 bash
coprocess에서 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
여기에 몇 가지 질문이 있습니다 ...
먼저 -i
Python의 옵션을 사용하여 대화형 모드로 전환하고 stdin에서 명령을 읽어 실행해야 합니다. 그래서:
coproc MY_BASH { python -i ; }
다음으로 Python은 명령을 구분하기 위해 세미콜론을 사용하지 않으므로 명령을 구분하려면 줄 바꿈을 사용해야 합니다.
echo $'print("Hello, World!")\nprint("EOD")' >&"${MY_BASH[1]}"