나는 이것이 서브쉘 프로세스에서 실행하는 것과 다르다는 것을 읽었습니다 $coproc < command >
.$< command > &
coproc
command
하지만 테스트해 보면 $< command > &
다음과 같이 작동합니다.
첫째, 테스트 행위입니다 $< command > &
.
$nano &
달리다터미널 1- 다른 tty에서 출력은
$ps -t tty1 --forest
nano 프로세스가 -bash 프로세스의 하위 프로세스임을 보여줍니다(로그인 bash 쉘 프로세스 -> 생성된 하위 쉘 프로세스 없음).
두 번째: 테스트 동작$coproc < command >
$coproc nano
달리다터미널 1- 다른 tty에서는 출력이
$ps -t tty1 --forest
위와 동일합니다(하위 쉘 프로세스가 생성되지 않음)
그럼 $coproc < command >
과 같은 건가요 $< command > &
?
사용된 쉘은배쉬 쉘
답변1
coproc utility
utility &
와 동일하지 않습니다 bash
.
표준 입력 및 출력 파일 설명자를 포함하는 coproc utility
배열을 얻게 됩니다 . 그러면 당신은 다음과 같은 것을 할 수 있습니다COPROC
utility
#!/bin/bash
coproc bc -l
for (( k = 0; k < 50; ++k )); do
printf '2.3*%d + 1\n' "$k" >&${COPROC[1]}
read -u "${COPROC[0]}" a
printf '%.2f\n' "$a"
done
kill "$COPROC_PID"
여기서는 bc -l
쉘 루프의 "산술 계산 서비스"처럼 작동하여 표준 입력에 대한 계산을 수행하기 위한 표현식을 취하고 표준 출력에 결과를 반환하는 코프로세스입니다.
내가 아는 한, bash
그것은 단지 지원합니다하나언제든지 협업하세요.
셸은 ksh93
공동 프로세스도 지원하지만 완전히 다른(그러나 더 세련된) 구문을 사용합니다. 이에 상응하는 스크립트는 다음과 같습니다 ksh93
.
#!/usr/bin/ksh93
bc -l |&
coproc_pid=$!
for (( k = 0; k < 50; ++k )); do
print -p -f '2.3*%d + 1\n' "$k"
read -p a
printf '%.2f\n' "$a"
done
kill "$coproc_pid"
여기서는 -p
명시적인 파일 설명자를 사용하는 대신 coprocess(다음으로 시작하는 프로세스)와 통신하도록 하는 및 옵션이 있습니다.print
read
|&
답변2
차이점은 다음과 같이 두 개의 I/O 채널이 생성된다는 것입니다 man bash
.
코프로세스는 명령이 & 제어 연산자를 사용하여 종료된 것처럼 서브셸에서 비동기식으로 실행되며, 실행 중인 셸과 코프로세스 사이에 양방향 파이프가 설정됩니다.