단일 변수를 "읽을" 때 왜 "$IFS"에 관심을 가져야 합니까?

단일 변수를 "읽을" 때 왜 "$IFS"에 관심을 가져야 합니까?

유사한 구조는 IFS= read -r varBash에서 변수에 대한 입력 행을 읽는 "표준" 방식으로 간주되는 경우가 많습니다(예:unix.SE에서).

$IFSnull을 설정하는 것이 종종 유익한 이유, 즉 단어 분리를 제어(방지)하는 이유는 분명합니다 . 그러나 읽을 때 이것이 특별히 필요한 이유를 이해하는 데 어려움을 겪고 있습니다.하나의바꾸다? Bash 매뉴얼은 다음과 같이 말합니다:

이름보다 단어가 더 많은 경우 나머지 단어와 중간 구분 기호는 성에 할당됩니다.

따라서 IFS를 변경하지 않더라도 read단일 변수를 전달하면 필요에 따라 전체 행을 해당 변수에 저장해야 하지 않습니까? $IFS이 경우 null을 설정하는 이유는 무엇입니까?

답변1

다음 예를 고려하세요( $IFS기본값을 사용하려면 설정하지 않음).

$ unset IFS
$ IFS= read -r foo <<<" a "
$ printf "%q\n" "$foo"
\ a\
$ read -r foo <<<" a "
$ printf "%q\n" "$foo"
a

또는 다른 값이 포함된 경우(bash 또는 zsh를 제외한 다른 POSIX 유사 쉘에서):

$ IFS=:
$ IFS= read -r foo <<< "a:"
$ printf "%q\n" "$foo"
a:
$ read -r foo <<< "a:"
$ printf '%q\n' "$foo"
a

이 사건은 다음과 같습니다질문에 언급된 게시물(강조하다):

이제 하나의 매개변수만 전달하면 read lineStill 이 되지 않습니다 read remaining_words. 백슬래시 처리가 아직 완료되었습니다.IFS 공백 문자²는 여전히 시작과 끝에서 제거됩니다..

관련 정보