IFS는 쉘 내장 읽기 이외의 용도로 사용됩니까? [복사]

IFS는 쉘 내장 읽기 이외의 용도로 사용됩니까? [복사]

IFS에 대해 읽을 때마다 항상 맥락이 있습니다 read(또는 적어도 제가 이해하는 방식은 그렇습니다).

readIFS는 쉘 내장 이외의 다른 용도로 사용됩니까?

답변1

POSIX 쉘 매뉴얼에는 필드 분할에 대한 다음 지침이 있습니다.

2.6.5 필드 분할

매개변수 확장(Parameter Expansion), 명령 대체(Command Substitution), 산술 확장(Arithmetic Expansion) 후에 쉘은 필드 분할을 위해 큰따옴표로 묶이지 않은 확장 및 대체 결과를 스캔하여 여러 필드를 생성할 수 있습니다.

쉘은 IFS의 각 문자를 구분 기호로 처리하고 구분 기호를 필드 종결자로 사용하여 매개변수 확장, 명령 대체 및 산술 확장의 결과를 필드로 분할해야 합니다.

IFS 값이 <space>, <tab>, 및 이거나 설정되지 않은 경우 <newline>입력의 시작 또는 끝 부분에 있는 , 또는 <space>문자 의 시퀀스 <tab>는 무시되고 입력에서 이러한 문자의 시퀀스는 필드를 구분합니다. <newline>예를 들어 다음을 입력합니다.

<newline><space><tab>foo<tab><tab>bar<space>

foo와 bar라는 두 개의 필드를 생성합니다.

IFS 값이 비어 있으면 필드 분할이 수행되지 않습니다.

그렇지 않으면 다음 규칙이 순서대로 적용됩니다. "IFS 공백"이라는 용어는 IFS 값에서 공백 문자의 시퀀스(0개 이상의 인스턴스)를 의미하는 데 사용됩니다. 예를 들어 IFS에 <space>/ <comma>/ 가 <tab>포함 된 경우 <space>및 문자의 <tab>시퀀스는 IFS 공백으로 간주됩니다.

입력의 시작과 끝 부분에 있는 IFS 공백은 무시되어야 합니다.

입력에서 IFS 공백이 아닌 IFS 문자와 인접한 IFS 공백이 발생할 때마다 위에서 설명한 대로 필드를 구분해야 합니다.

길이가 0이 아닌 IFS 공백은 필드를 구분해야 합니다.

따라서 쉘이 인용되지 않은 인수, 명령 대체 또는 산술 확장을 확장할 때마다 IFS 설정 방법에 따라 결과를 필드로 분할합니다.

다음을 통해 매개변수 확장의 맥락에서 이를 확인할 수 있습니다.

$ IFS=$' \t\n'
$ var='foo:bar'
$ printf '<%s>\n' $var
<foo:bar>
$ IFS=:
$ printf '<%s>\n' $var
<foo>
<bar>
$ printf '<%s>\n' "$var"
<foo:bar>
$ set -- foo bar baz
$ echo "$*"
foo:bar:baz
$ IFS=$' \t\n'
$ echo "$*"
foo bar baz
$

관련 정보