매초 EOF를 사용하여 fifo에 데이터 파이핑

매초 EOF를 사용하여 fifo에 데이터 파이핑

일부 원시 바이너리 데이터를 fifo(out.pipe)로 파이프하고 EOF가 주기적으로 전송되는지 확인하려고 합니다. 다음 줄이 내가 원하는 것을 수행하지 않는 이유를 이해할 수 없습니다.

while true; do read -t 1 -N 128 line; echo -n $line > out.pipe; done

타임아웃이 발생하면 null 값이 주어진 것처럼 보이고 $line, 발생하지 않더라도 입력에서 모든 줄바꿈이 제거됩니다. 이것은 무슨 일이 일어나야 하는지에 대한 나의 이해가 아니다이 파일:

-N자

EOF 또는 읽기 시간 초과가 발생하지 않는 한, 전체 입력 줄을 기다리지 않고 정확히 nchars 문자를 읽은 후 read가 반환됩니다. 입력에서 발견된 구분 기호는 특별히 처리되지 않으며 nchars 문자를 읽을 때까지 읽기가 반환되지 않습니다.

-t 시간 ​​초과

전체 입력 줄(또는 지정된 문자 수)을 시간 초과 초 내에 읽지 않으면 읽기 시간 초과가 발생하고 실패가 반환됩니다. timeout은 소수점 뒤에 소수 부분이 있는 십진수일 수 있습니다. 이 옵션은 읽기가 터미널, 파이프 또는 기타 특수 파일에서 입력을 읽는 경우에만 효과가 있습니다. 일반 파일에서 읽을 때는 효과가 없습니다. 읽기 시간이 초과되면 읽기는 지정된 변수 이름에 읽은 부분 입력을 저장합니다. 시간 제한이 0이면 read는 데이터 읽기를 시도하지 않고 즉시 반환됩니다. 지정된 파일 설명자에서 입력을 사용할 수 있으면 종료 상태는 0이고, 그렇지 않으면 0이 아닙니다. 시간 초과가 초과되면 종료 상태는 128보다 큽니다.

-N 128에 매개변수가 없고 에 매개변수가 read없으면 이는 내가 원하는 것과 매우 가깝습니다. 문제는 줄 바꿈이 특별히 처리되어 데이터가 전달되지 않는 경우에도 전송된다는 것입니다.-necho

while true; do read -t 1 line; echo $line > out.pipe; done

나는 다음 줄을 사용하여 내 파이프라인에 무엇이 들어가는지 테스트해 왔습니다.

while true; do cat out.pipe; done

stdin을 통한 입력 전송과 with를 통한 HTTP 데이터 전송을 테스트했는데 echo -e "GET / HTTP/1.1\r\nHost: hostname\r\n\r\n" | nc localhost 80 | myreadcommand외로운 문자로 인해 \r매우 혼란스럽습니다 .

내가 이해하지 못하는 것은 무엇입니까? 이를 수행하는 더 좋은 방법이 있습니까? 내가 무엇을 놓치고 있습니까?

답변1

read매뉴얼 페이지에는 다음과 같이 나와 있습니다.

종결자 <newline>(있는 경우)는 입력에서 제거되어야 하며 결과는 쉘의 매개변수 확장 결과와 마찬가지로 필드로 분할되어야 합니다.

또한 새 줄을 처리하는 방법에 대해 전달한 매개 변수를 기반으로 여러 예외를 기록합니다. 그러한 예외 사항이 중요하다면 매뉴얼 페이지 전체를 읽어야 합니다.

예를 들어 특정 문자를 무시하려면 \r다음과 같이 쉽게 수행할 수 있습니다 sed.

echo "hi\r\nI am a script" | sed "s/\r//g"

교체를 더욱 명확하게 하려면 다음과 같은 다른 것으로 교체할 수 있습니다.

echo "hi\r\nI am a script" | sed "s/\r/,/g"

-efor 인수를 사용하면 echo입력에 있는 실제 줄 바꿈 문자와 실제로 일치하지 않는 백슬래시 특수 문자 조합을 해석하게 된다는 점에 유의하는 것도 중요합니다 .

관련 정보