프로그래밍 방식으로 파이프/종료 닫기 [닫기]

프로그래밍 방식으로 파이프/종료 닫기 [닫기]

다음과 같은 파이프라인이 있습니다.

  tail -n0 -f  "${my_input}" | ql_receiver_lock_holder | while read line; do
   echo "$line" >> "${my_output}";
   # xxx: how can I programmatically close the pipeline at this juncture?
  done & disown;

내 질문: xxx를 표시하는 파이프를 프로그래밍 방식으로 닫는 방법이 있습니까? 아마도 전화를 걸 수도 있겠지만 exit 0;현재 파이프를 어떻게든 닫을 수 있는 방법이 있는지 알고 싶습니다.

답변1

존재하다:

tail -n0 -f -- "$my_input" |
  ql_receiver_lock_holder |
  sed /xxx/q > "$my_output"
  • sed포함된 첫 번째 줄을 읽은 후 종료됩니다 xxx.
  • ql_receiver_lock_holder그런 다음 stdout(현재 손상된 파이프)에 처음 쓸 때 종료됩니다(SIGPIPE에 의해 종료됨).
  • 마찬가지로 tail이후 첫 번째 쓰기 시 종료됩니다.

stdout에 대한 다음 쓰기를 기다리지 않고 즉시 ql_receiver_lock_holder종료 하려면 아래 설명된 방법을 사용할 수 있습니다.tailsed

알아채다이러한 종류의 while read루프는 셸에서 텍스트를 처리하는 올바른 방법이 아닙니다.. 최소한 다음과 같은 것이 필요합니다.

while IFS= read -r line; do
  printf '%s\n' "$line"
  case $line in
    (*xxx*) break
  esac
done

대체 sed /xxx/q하지만 입력이 매우 작지 않으면 매우 비효율적입니다.

관련 정보