Bash≥4하면 coproc
을 사용할 수 있습니다 :이 임시 FIFO를를 사용하는 것을 피한다
#!/bin/bash
coproc nc { nc 10.0.0.104 4646; }
while [[ $nc_PID ]] && IFS= read -r -u${nc[0]} line; do
case $line in
('{"cmd": 1}')
printf >&${nc[1]} '%s\n' '{"error": 0}'
;;
(*)
printf >&2 '%s\n' "Received line:" "$line"
;;
esac
done
. coproc
이 없다면, 남은 유일한 옵션은 FIFO를 명시 적으로 사용하는 것입니다. 다음은 예입니다 :이를 위해
#!/bin/bash
mkfifo fifo_in
while IFS= read -r line; do
case $line in
('{"cmd": 1}')
printf '%s\n' '{"error": 0}'
;;
(*)
printf >&2 '%s\n' "Received line:" "$line"
;;
esac
done < <(nc 10.0.0.104 4646 < fifo_in) > fifo_in
, 당신은 FIFO의 생성 및 삭제를 관리해야합니다 : 당신은 다음, 생성 거기에, mktemp
에 임시 디렉토리를 만들 수 trap
스크립트를 FIFO가 필요합니다 그래서 출구에서 모든 것이 청소됩니다.
/dev/tcp
을 배시가 순 리디렉션을 지원하도록 컴파일 된 경우는, 당신은 nc
의 및 전부 FIFO를하고 coprocesses 제거 할 수 있습니다
#!/bin/bash
# open TCP connection, available on file descriptor 3
exec 3<> /dev/tcp/10.0.0.104/4646 || exit
while IFS= read -r -u3 line; do
case $line in
('{"cmd": 1}')
printf >&3 '%s\n' '{"error": 0}'
;;
(*)
printf >&2 '%s\n' "Received line:" "$line"
;;
esac
done
이 매우 가능성이 달콤한입니다 해결책!
좋은 물건. O.P.가 bash 4를 사용할 수없는 경우, 이러한 기능은 몇 년 동안 ksh에있었습니다. 하지만 그것은 ksh의 어떤 버전이 사용 가능한지에 따라 다르지만 테스트할만한 가치가 있습니다. O.P.는 프로덕션 환경에 새로운 내용을 설치하지 않아도됩니다. 모두에게 행운을 빕니다. – shellter
좋은 답변 - 내 투표 :-) –