![프로그래밍 방식으로 파이프/종료 닫기 [닫기]](https://linux55.com/image/131965/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%20%EB%B0%A9%EC%8B%9D%EC%9C%BC%EB%A1%9C%20%ED%8C%8C%EC%9D%B4%ED%94%84%2F%EC%A2%85%EB%A3%8C%20%EB%8B%AB%EA%B8%B0%20%5B%EB%8B%AB%EA%B8%B0%5D.png)
다음과 같은 파이프라인이 있습니다.
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
종료 하려면 아래 설명된 방법을 사용할 수 있습니다.tail
sed
알아채다이러한 종류의 while read
루프는 셸에서 텍스트를 처리하는 올바른 방법이 아닙니다.. 최소한 다음과 같은 것이 필요합니다.
while IFS= read -r line; do
printf '%s\n' "$line"
case $line in
(*xxx*) break
esac
done
대체 sed /xxx/q
하지만 입력이 매우 작지 않으면 매우 비효율적입니다.