-N 플래그를 사용해도 공백을 "읽기"하는 이유는 무엇입니까?

-N 플래그를 사용해도 공백을 "읽기"하는 이유는 무엇입니까?

매뉴얼에 따르면 read(내장되어 있기 때문에 가 아니지만 man read) help read:

-N ncharsEOF 또는 읽기 시간 초과가 발생하지 않는 한 모든 구분 기호를 무시하고 정확히 NCHARS 문자를 읽은 후에만 반환합니다.

그러나 -N해당 플래그를 사용 하더라도 read여전히 입력 데이터에서 구분 기호를 제거하고 싶은 것 같습니다. 다음 데이터를 예로 들어 보겠습니다.

# readfail.sh - Reads 5 characters at a time, and adds "RegEx style" start and end characters for clarity
while read -r -N 5 data; do
    echo "^${data}\$"
done;

echo "^${data}\$"  # There will be data left over just because of the way `read` uses exit codes

출력은 다음과 같습니다.

$ echo -n "Lorem ipsum dolor sit amet" | ./readfail.sh
^Lorem$
^ipsu$
^m dol$
^or si$
^t ame$
^t$

두 번째 줄의 길이는 4자에 불과합니다. 이는 Lorem와 사이에 공백이 있어야 하기 때문입니다 ipsum. 그러면 다음과 같은 5개의 문자가 출력됩니다.^ ipsu$

IFS=루프 이전에 설정하여 이 문제를 해결할 수 있었습니다.그러나 그렇게 해서는 read안 된다 .소홀히 하다-N플래그 로 인한 구분 기호가 있나요? 이것은 버그인가요, 아니면 의도적인 동작인가요?

답변1

-N줄 끝 구분 기호가 무시됩니다. Bash는 문자가 무엇이든 관계없이 지정된 수의 문자를 정확하게 읽습니다. 이는 읽은 내용이 스크립트에 변수 내용으로 보고되는 방식과는 아무런 관련이 없습니다. 이는 일반적인 IFS분할 메커니즘을 사용합니다.

관련 정보