다음과 같은 파이프라인이 있습니다.
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
하지만 입력이 매우 작지 않으면 매우 비효율적입니다.